MySQL — какой fetch_style я использую с PDO, чтобы я мог использовать функцию PHP extract ()?

У меня есть следующее:

extract($this->model->findByStudentID(4));
print_r($this->model->findByStudentID(4));
echo "student id: " . $student_id;

extract() функция дает мне int(0), print_r() дает мне:

Array ( [0] => Array ( [student_id] => 4 ......

Когда я пытаюсь отобразить переменную $ student_id, я ничего не получаю. Нет ошибок, ничего.

$row($this->model->findByStudentID(4));
echo $row["student_id"];

Это выше дает мне неопределенный индекс.

Мой запрос:

$sql = 'SELECT * FROM students WHERE student_id = :student_id';
$this->adapter->prepare($sql);
$place_holders = array(':student_id' => $_student_search);
$this->adapter->execute($place_holders);
$results = $this->adapter->fetchAll();

foreach ($results as $student){
echo "</br>" . $student["student_id"] . " , " . $student["LAST"] . "</br>";

} //this works

extract($results);
echo $student_id . ' My student ID.';  //undefined variable

Наконец, это работает:

 echo $results[0]['student_id'] . ' THIS IS IT';

Я возвращаю только одну запись каждый раз, так как мне получить extract() работать, чтобы я мог просто иметь $student_id через extract() функционировать?

Как я могу увидеть, что extract() сделано?
Как мне сослаться на мои извлеченные переменные, которые, как я думал, должны были быть $ student_id, $ last, $ first и т. Д.
(Я не использую extract () с переменными запроса, поэтому extract в этом контексте кажется действительным.)

0

Решение

extract возвращает количество переменных, которые он извлек. Таким образом, вы не можете непосредственно увидеть, что это сделано.

Использование его для этой цели создаст головную боль позже именно по этой причине: вы не можете видеть, какие переменные он создал. Когда вы или кто-то еще вернетесь к этому куску кода позже, вы или они будете использовать несколько слов проклятия выбора! Вам лучше использовать параметры массива или объекта из выборки PDO.

Как сказал @bad_boy в комментариях, он больше подходит для извлечения переменных в область действия шаблона.


Типичным примером шаблонов для демонстрации того, где он часто используется, будет что-то вроде этого:

ob_start();
extract($myDataForTheTemplate);
include('my-template.phtml');
$templateContents = ob_get_clean();

Содержание $myDataForTheTemplate Массив доступен для файла шаблона, включенного ниже.

Вместо того, чтобы использовать $myDataForTheTemplate['myValue'], шаблон сможет сделать:

<p><?= $myValue ?></p>

Обратите внимание, что это только базовый пример, демонстрирующий общий вариант использования extract, В большинстве случаев это не нужно или усложнит ситуацию.

3

Другие решения

extract() нужен ассоциативный массив. Вы передаете ему числовой индексированный массив, поэтому он не может вернуться 0 поскольку никакие переменные не были извлечены. По сути, вы просите это установить переменные с такими именами:

$0
$1
...
$n (index for your last row of data)

Это явно недопустимые имена переменных.

Как уже упоминали другие, используя extract() Обычно это плохая практика, так как вы загрязняете глобальное пространство имен очень неинтуитивным образом. Например, что, если схема БД изменилась, чтобы добавить новый столбец. Вы могли бы вводить новое имя переменной в глобальную область без чего-либо в своем коде, чтобы показать вам это.

2