#php #pdo
#php #pdo
Вопрос:
Я создал формат MVC в PHP, и я получаю Trying to get property of non-object
ошибку, потому что обычный объект равен null, который, как вы видите, является false. Короче говоря, здесь происходит то, что я получил объект $ event, который имеет routine_id, и я ищу объект routine, который имеет тот же routine_id, что и объект event, однако я получаю эту ошибку:
нет уведомления: Попытка получить свойство не-объекта в G:5th semesterEcommercexampphtdocsappcontrollersEvent.php в строке 13 bool(false) aaaaaaaaaaaaaaaarray (1) { [0]=> object(Event_model) #6 (8) { [«name»]=> NULL [«user_id»]=> NULL [«routine_id»]=> string(2) «20» [«year»]=> string(4) «2019» [«месяц»] => string(1) «3» [«день»]=> строка (2) «27» [«event_id»]=> строка (1) «3» [«_connection»: protected]=> объект (PDO)#7 (0) { } } }
Я пытаюсь var_dump $routine и $event, поэтому $event показывает routine_id, но $ routine имеет значение null.
Тестирование кода:
var_dump($routine);
echo "aaaaaaaaaaaaaaaaaa";
var_dump($event);
public function index($y, $m, $d) {
$event = $this->model('Event_model');
$event = $event->getEventsbydate($y, $m, $d);
$routine = $this->model('Routine_model');
$routine = $routine->getRoutine($event->routine_id);
if($event == false){ //if there is nothing in the workout_list
header("location:/Event/create/$y/$m/$d"); //mylist controller , create method
} else {
var_dump($routine);
echo "aaaaaaaaaaaaaaaaaa";
var_dump($event);
//header('location:/Routine/index_bycalendar/$event->routine_id');
}
}
<?php
//for event
public function insert() {
$stmt = $this
->_connection
->prepare("INSERT INTO event(routine_id, year, month, day) VALUES(:routine_id, :year, :month, :day)");
$stmt->execute(['routine_id' => $this->routine_id, 'year' => $this->year, 'month' => $this->month, 'day' => $this->day]);
return $stmt->rowCount();
}
public function getEventsbydate($year, $month, $day) {
$stmt = $this
->_connection
->prepare("SELECT * FROM event WHERE year = :year AND month = :month AND day = :day");
$stmt->execute(['year' => $year, 'month' => $month, 'day' => $day]);
$stmt->setFetchMode(PDO::FETCH_CLASS, "Event_model"); //datatype user
return $stmt->fetchAll();
}
public function getRoutine($routine_id) {
$stmt = $this
->_connection
->prepare("SELECT * FROM routine WHERE routine_id = :routine_id");
$stmt->execute(['routine_id' => $routine_id]);
$stmt->setFetchMode(PDO::FETCH_CLASS, "Routine_model"); //datatype user
return $stmt->fetch(); //it should return a user
}
Комментарии:
1. Попробуйте выполнить инструкцию sql из метода getRoutine() в вашем sql-клиенте (например, в phpMyAdmin ) с жестко заданным
routine_id
значением ( 20 ). НравитсяSELECT * FROM routine WHERE routine_id = 20
. Что вы получаете в результате?2. Спасибо за комментарий, я получаю строку, которую я хочу получить, которая является routine_id = 20
Ответ №1:
Когда вы вызываете…
$event = $event->getEventsbydate($y, $m, $d);
это должно запустить SQL, а затем вернуть…
return $stmt->fetchAll();
и затем вы используете $event
в
$routine = $routine->getRoutine($event->routine_id);
НО fetchAll()
возвращает массив событий, поэтому, если вы ожидаете только одно событие, вы можете выполнить одно из них…
return $stmt->fetch();
использовать fetch()
, чтобы просто вернуть одну строку, или
$routine = $routine->getRoutine($event[0]->routine_id);
Поэтому используйте $event[0]
, чтобы выбрать первую строку.
Может случиться так, что у вас будет несколько событий, в этом случае вам может понадобиться цикл и создать несколько Routine_model
с.