Вход Регистрация
Комментировать коды можно с уровня Продвинутый
[отв] * KpuTuK (Adm) (5 Янв 2016 в 15:57)
VITAMIN, да чо вы уперлись в эти подготавливаемые выражения???
Пример #3 Выражение INSERT один раз подготавливается, а затем многократно выполняется

  1. <?php
  2. $mysqli = new mysqli("example.com", "user", "password", "database");
  3. if ($mysqli->connect_errno) {
  4. echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
  5. }
  6.  
  7. /* обычный запрос */
  8. if (!$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) {
  9. echo "Не удалось создать таблицу: (" . $mysqli->errno . ") " . $mysqli->error;
  10. }
  11.  
  12. /* подготавливаемый запрос, первая стадия: подготовка */
  13. if (!($stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)"))) {
  14. echo "Не удалось подготовить запрос: (" . $mysqli->errno . ") " . $mysqli->error;
  15. }
  16.  
  17. /* подготавливаемый запрос, вторая стадия: привязка и выполнение */
  18. $id = 1;
  19. if (!$stmt->bind_param("i", $id)) {
  20. echo "Не удалось привязать параметры: (" . $stmt->errno . ") " . $stmt->error;
  21. }
  22.  
  23. if (!$stmt->execute()) {
  24. echo "Не удалось выполнить запрос: (" . $stmt->errno . ") " . $stmt->error;
  25. }
  26.  
  27. /* подготавливаемый запрос: повторные выполнения, на сервер передаются только значения переменных */
  28. for ($id = 2; $id < 5; $id++) {
  29. if (!$stmt->execute()) {
  30. echo "Не удалось выполнить запрос: (" . $stmt->errno . ") " . $stmt->error;
  31. }
  32. }
  33.  
  34. /* рекомендуется явно закрывать запросы */
  35. $stmt->close();
  36.  
  37. /* обычный запрос */
  38. $res = $mysqli->query("SELECT id FROM test");
  39. var_dump($res->fetch_all());
  40. ?>

Результат выполнения данного примера:

Осторожно, спойлер (+/-)

Каждый подготавливаемый запрос использует ресурсы сервера. Если запрос больше не нужен, его необходимо сразу закрыть. Если не сделать этого явно, запрос закроется сам, но только когда PHP освободит его дескриптор, как правило это происходит при выходе запроса из области видимости или при завершении работы скрипта.

Использование подготавливаемых запросов не всегда приводит к повышению эффективности. Если параметризованный запрос запускается лишь раз, это приводит к большему количеству клиент-серверных обменов данными, нежели при выполнении простого запроса. Именно по этой причине в примере выше выражение SELECT выполнялось, как обычный запрос.

Также, имеет смысл рассмотреть SQL синтаксис вставки множества значений в выражении INSERT. В примере выше мультивставка (значения для вставки перечисляются через запятую) в предложении INSERT обошлась бы дешевле, чем подготовленный запрос.

[отв] * VITAMIN (5 Янв 2016 в 15:41)
prepare есть с bindparam
Онлайн: 1
Реклама