문제

사진 그룹을위한 PHP 캘린더 앱을 구축하고 있습니다. 단일 이벤트에 여러 날짜/시간을 할당 할 수 있어야합니다.

현재로서는 이벤트 테이블과 슬롯 테이블 (시간 슬롯 용)이 있습니다. 이벤트에는 ID, 제목 및 설명 만 있으며 슬롯에는 ID, 시작 시간, 종료 시간 및 Event_Id가 외래 키로 있습니다.

이벤트 클래스와 슬롯 클래스를 만들었고 $ event-> save () 메소드를 트리거 한 다음 각 슬롯을 순환하고 순환하여 제출시 두 테이블을 업데이트 할 수있는 이벤트를 업데이트하기위한 양식이 있습니다. 각각에 대한 $ slot-> save () 메소드를 트리거합니다.

아래 코드를 포함 시켰습니다. 양식을 제출할 때 $ slot-> save () 섹션에서 오류를 돌려 받고 이유를 알 수 없습니다.

업데이트 : 일부 방법에 대한 코드 추가.

        public static function find_by_id($id=0) {
            global $database;
            $result_array = self::find_by_sql("SELECT * FROM " . self::$table_name . " WHERE id={$id} LIMIT 1 ");
            return !empty($result_array) ? array_shift($result_array) : false;
        }

        public static function find_by_sql($sql="") {
            global $database;
            $result_set = $database->query($sql);
            $object_array = array();
            while ($row = $database->fetch_array($result_set)) {
                $object_array[] = self::instantiate($row);
            }
            return $object_array;
        }

        private static function instantiate($record) {
            // Could check that $record exists and is an array
            // Simple, long-form approach: (if 100 cols, this would be huge)
            // PHP 5.3 LSB : $class_name = get_called_class();
            $object = new self;
            // $object->id      = $record['id'];
            // $object->username    = $record['username'];
            // $object->password    = $record['password'];
            // $object->first_name = $record['first_name'];
            // $object->last_name   = $record['last_name'];

            // More dynamic, short-form approach:
            foreach($record as $attribute=>$value) {
                if($object->has_attribute($attribute)) {
                    $object->$attribute = $value;
                }
            }       
            return $object;
        }

        public function save() {
            // A new record won't have an id yet.
            return isset($this->id) ? $this->update() : $this->create();
        }

        protected function create() { // protected so you are forced to call save() method for safety (no duplicate creates)
            global $database;
            $attributes = $this->sanitized_attributes();
            $sql = "INSERT INTO ". self::$table_name ." (";
            $sql .= join(", ", array_keys($attributes));
            $sql .= ") VALUES ('";
            $sql .= join("', '", array_values($attributes));
            $sql .= "')";
            if($database->query($sql)) {
                $this->id = $database->insert_id();
                return true;
            } else {
                return false;
            }
        }

        protected function update() {
            global $database;
            $attributes = $this->sanitized_attributes();
            $attribute_pairs = array();
            foreach ($attributes as $key => $value) {
                $attribute_pairs[] = "{$key} = '{$value}'";
            }
            $sql = "UPDATE ". self::$table_name ." SET ";
            $sql .= join(", ", $attribute_pairs);
            $sql .= " WHERE id=". $database->escape_value($this->id);
            $database->query($sql);
            return ($database->affected_rows() == 1) ? true : false;

        }           

그리고 이제 원래 코드에 :

<?php
require_once('../../includes/init.php');
if (!$session->is_logged_in()) { redirect_to("login.php"); }
$user = User::find_by_id($session->user_id);

if (!isset($_GET['e'])) { redirect_to("calendar.php"); }
else { $event_id = $_GET['e']; }

$sql = "SELECT * FROM slots WHERE event_id = {$event_id}";

// find_by_sql() method also instantiates each row as a new Slot object
// $slots is now an array() of objects
$slots = Slot::find_by_sql($sql);

// new Slot object used for adding a time slot to current event
$blank_slot = new Slot();

// initialize $message var to ""
$message="";

// Check to see if either of the submit buttons have been set in the $_POST
if (isset($_POST['edit_event']) || isset($_POST['add_slot'])) {

// Counts the number of slots associated with the current event id
// Add one so that there is a blank field to add another time slot
$count = count($slots) + 1;

// Vars for checking if the last m/d/y is set in the form, before adding another slot field
$check_month = "month" . $count;
$check_year = "year" . $count;
$check_day = "day" . $count;

// initialize running errors var
$errors = 0;

// Don't add another slot field if the previous one has not been set
if (isset($_POST['add_slot']) && (empty($_POST[$check_month]) || empty($_POST[$check_year]) || empty($_POST[$check_day]))) {
                $message .= "Oops, you must enter a value for all months, dates, and years before adding a new date to this event.<br />";
                $errors++;

} else {
    // create new Event object and set attrs from $_POST vars   
    $event = new Event();       
    $event->id = $event_id;
    $event->title = $_POST['title'];
    $event->description = $_POST['description'];
    $event->category = $_POST['cat'];

    $new_event = $event->save();
    if ($new_event = true) {
        $i = 1;
        // for each of the $slots objects...
        foreach ($slots as $slot) {
            // get the db_fields for the object
            $fields = Slot::get_db_fields();
            // for each field...
            foreach ($fields as $field) {
                // create a $field_n var that appends $i, to match $_POST name
                $field_n = $field . $i;
                if ($field == 'id') {
                    $slot_id_n = "slot_id" . $i;
                    $slot->id = $_POST[$slot_id_n];
                }
                elseif ($field == 'start_hour') {
                    $start_ampm_n = "start_ampm" . $i;
                    $start_hour = Slot::convert_to_military($_POST[$field_n], $_POST[$start_ampm_n]);
                    $slot->start_hour = $start_hour;
                } elseif ($field == 'end_hour') {
                    $end_ampm_n = "end_ampm" . $i;
                    $end_hour = Slot::convert_to_military($_POST[$field_n], $_POST[$end_ampm_n]);
                    $slot->end_hour = $end_hour;
                } elseif ($field == 'start_ampm' || $field == 'end_ampm') {
                } elseif ($field == 'event_id') {
                    $slot->event_id = $event_id;
                } elseif ($field == 'status') {
                    $slot->status = "confirmed";
                } else {
                    $slot->$field = $_POST[$field_n];
                }
            }

            // save() method runs create() or update() method
            $save_slot = $slot->save();
            // save m and y for redirecting back to calendar
            $last_month = $slot->month;
            $last_year = $slot->year;
            if ($save_slot == false) {

 // THIS IS THE ERROR I AM ALWAYS GETTING

                $message .= "(1) Problem saving time slot number {$i}.<br />"; 
                // rollback previous $slot and $event saves!
                $errors++;
            }

        $i++;
        }
        // add the new time slot, if it exists
        if (!empty($_POST[$check_month]) && !empty($_POST[$check_year]) && !empty($_POST[$check_day])) {
            $fields = Slot::get_db_fields();
            foreach ($fields as $field) {
                $field_n = $field . $i;
                if ($field == 'id') {
                $slot_id_n = "slot_id" . $i;
                    if(!empty($_POST[$slot_id_n])) {
                        $blank_slot->id = $_POST[$slot_id_n];
                    } else {
                        $blank_slot->id = NULL;
                    }
                }
                elseif ($field == 'start_hour') {
                    $start_ampm_n = "start_ampm" . $i;
                    $start_hour = Slot::convert_to_military($_POST[$field_n], $_POST[$start_ampm_n]);
                    $blank_slot->start_hour = $start_hour;
                } elseif ($field == 'end_hour') {
                    $end_ampm_n = "end_ampm" . $i;
                    $end_hour = Slot::convert_to_military($_POST[$field_n], $_POST[$end_ampm_n]);
                    $blank_slot->end_hour = $end_hour;
                } elseif ($field == 'start_ampm' || $field == 'end_ampm') {
                } elseif ($field == 'event_id') {
                    $blank_slot->event_id = $event_id;
                } elseif ($field == 'status') {
                    $blank_slot->status = "confirmed";
                } else {
                    $blank_slot->$field = $_POST[$field_n];
                }
            }
            $save_slot = $blank_slot->save();
            $last_month = $blank_slot->month;
            $last_year = $blank_slot->year;
            if ($save_slot == false) {
                $message .= "Problem saving time slotb number {$i}.<br />";
                // rollback previous $slot and $event saves!
                $errors++;
            }
        }       
    } else {
        $message .= "Error updating the event.<br />";
        $errors++;
    }

    if ($errors == 0) {
        $redirect = "calendar.php";
        if (isset($last_month) && isset($last_year)) {
            $redirect .= "?m={$last_month}&y={$last_year}";
        }
        if (isset($_POST['edit_event'])) { redirect_to($redirect); }
    }
}
}
$event = Event::find_by_id($event_id);
?>

<?php include_layout_template('header.php'); ?>
<div id="main"> 
    <h1>Edit Event</h1>
    <?php if (!empty($message)) { echo "<p class='message'>" . $message . "</p>"; } ?>
    <a href="calendar.php">Cancel (Go back to the Calendar)</a></p><br /><br />
    <form style="width: 700px;" action="?e=<?php echo $event_id; ?>" method="post">
    <?php echo $event->build_event_form(); ?>
    <?php 
    $sql = "SELECT * FROM slots WHERE event_id = {$event_id}";
    $slots = Slot::find_by_sql($sql);
    ?>
<br /><br />
<?php
    $num = 1;
    foreach ($slots as $slot) {
        echo $slot->build_slot_form($num);
        $num++;
    }
    echo $blank_slot->build_slot_form($num);
?>
    <br /><br /><br />
    <input type="hidden" name="date_count" value="<?php echo $num; ?>">
    <input type="submit" name="edit_event" value="Edit Event" />
    <input type="submit" name="add_slot" value="Add Another Date">
    </form>

</div>

<?php include_layout_template('footer.php'); ?>
도움이 되었습니까?

해결책 2

대답이 발생합니다! my update () 메소드 (save () 메소드로 호출)는 mysql_affected_rows ()를 사용하여 업데이트가 발생했는지 확인했습니다. 내 양식에는 여러 가지 가능한 업데이트가 포함되어 있습니다. 각 업데이트, 1, 모두 또는 그 중 어느 것도 업데이트 될 수 없습니다 (이벤트 세부 사항이 업데이트 된 경우 아래의 시간 슬롯을 업데이트 할 수 없습니다).

내 코드가 실제로 변경되지 않은 시간 슬롯에 도착하자마자 MySQL_Affected_rows ()는 0을 반환했습니다.

따라서 모든 것이 효과가 있었음에도 불구하고 평가는 거짓으로 반환되었습니다. "if (mysql_affed_rows == 1)"에서 Update () 메소드를 대신 "if (mysql_affected_rows! == -1)"로 전환하여 0 행이 영향을 받더라도 MySQL 오류가 발생하지 않았는지 확인합니다.

어쨌든 감사합니다!

다른 팁

Save () 메소드에 액세스하려면 해당 클래스의 인스턴스를 올바르게 작성해야합니다.

이벤트 수업을 위해했던 방식과 같습니다.

$event = new Event();
$event->save();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top