ruskar
@ruskar
Conflict Intelligence Team

Выборка данных из базы через MySQLi и подготовленные выражения?

Сейчас многие рекомендуют использовать новое расширение MySQLi для запросов к БД, которое обещает нам поддержку всех новых возможностей MySQL, больше удобств и более высокую скорость работы.

Одно мне непонятно: почему для такого «нового» и «крутого» расширения не придумали метод, позволяющий после выполнения подготовленного выражения получать заранее неизвестное количество полей? Я имею ввиду выборку вида:
SELECT * FROM table;

В функцию подготовки результата выражения даже нельзя передать одну переменную-массив, ключи и значения которого стали бы результатом выборки.


В результате если мы имеем таблицу вида:

ПолеТип
idINT(10)
field1VARCHAR(20)
field2VARCHAR(20)


то при запросе:
$stmt = $mysqli->prepare("SELECT * FROM table WHERE id = ?");
$stmt->bind_param('i', $itemid);
$stmt->execute();
$stmt->bind_result($id, $field1, $field2);
$stmt->fetch();


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

Почему так сделано?
  • Вопрос задан
  • 5812 просмотров
Решения вопроса 1
@lanabel
Столкнувшись с аналогичной проблемой долго пользовалась костылем из комментария zvirusz. Но недавно наткнулась на информацию о PDO. PDO позволяет:
1) Легко менять платформу SQL при использовании совместимых запросов;
2) Использовать prepared statements
3) Получать ассоциированный массив без костылей при помощи PDO::FETCH_ASSOC

Код получается что-то вроде
$stmt = $db->prepare("SELECT * FROM foo WHERE a = ?");
$stmt->execute(array($a));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);


Собираюсь переводить свой проект на PDO, возможно и вам стоит глянуть в эту сторону, пока не завязли с MySQLi.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Одно мне непонятно: почему для такого «нового» и «крутого» расширения не придумали метод, позволяющий после выполнения подготовленного выражения получать заранее неизвестное количество полей?

Костыль можно найти почти всегда: ru.php.net/manual/en/mysqli-stmt.fetch.php#82742

Почему так сделано?

Видимо потому, что бездумная выборка всех полей — моветон.
Ответ написан
Комментировать
akalend
@akalend
программирую
Новое расшрение дает новые возможности. Вы выбрали режим «подготавливаемый SQL», т.е. при первом выполнении компилится SQL выражение и в скомпилированном виде хранится в кеше SQL запросом. Это позволяет экономить время на компиляцию и увеличивает производительность.
Если Вы изменили структуру таблицы, то Ваша откомпилированноое выражение уже не подойдет под новую структуру. Отсюда и ошибка. Вывод:
либо задаем все поля, либо не используем «подготавливаемые выражения»
Ответ написан
Комментировать
@gro
Какое же оно новое? Уже четвёртый год, как официально основное средство для работы с mysql.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы