Подготовленное заявление ничего не возвращает

StackOverflow https://stackoverflow.com/questions/1019959

  •  06-07-2019
  •  | 
  •  

Вопрос

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

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($content);
$stmt->fetch();
echo  $content;
$stmt->close();

Любые советы или указания в правильном направлении приветствуются!

РЕДАКТИРОВАТЬ 1: Просто обновленная информация о моем прогрессе, поскольку я пытаюсь устранить неполадки. Я понял, что, поскольку у меня есть столбец id в качестве индекса в таблице разделов, мне нужно было также связать это в результате, учитывая вышеприведенное утверждение на php.net (спасибо еще раз, Билл).

Вот новый код:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($id, $name, $content);
$stmt->fetch();
echo $content;
$stmt->close();

Еще раз спасибо всем, кто может предложить предложения. (Мне любопытно: мне трудно отлаживать при использовании подготовленных операторов в стиле ООП таким способом. Есть ли, например, простой способ просто увидеть запрос, который фактически использовался?)

РЕДАКТИРОВАТЬ 2: Привет, и спасибо за этот тест, я действительно ценю это. Я понимаю вопрос, который вы были вынуждены задать, так как теперь я тоже долго над этим размышлял. Я должен сказать, что это существует.

Если я сделаю следующее, просто как быстрый пример:

$name = 'introduction';
@mysql_connect('host', 'user', 'pass');
@mysql_select_db('db');
$query = "SELECT name,content FROM sections WHERE name = '$name'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
    $content = $row->content;
    echo $content;
}

Мои данные отображаются и все хорошо. Однако, если я сделаю следующее:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($name, $content);
$stmt->fetch();
echo  $content;
$stmt->close();

Что я считаю правильным (не стесняйтесь кричать, если нет, конечно), я ничего не получаю. Более того, с этим кодом, когда я делаю проверку HTML (на всякий случай), я получаю предупреждение о внутреннем сервере (500), которое я считаю проблемой с кодом SQL. Я просто чокнутый?

Спасибо за вашу постоянную помощь, она очень ценится!

РЕДАКТИРОВАТЬ 3: Ну, я чувствую себя идиотом, но я исправил это, и Билл, твой вопрос был прав. Я не знаю, как мне удавалось вводить неверные данные в базу данных и так долго их пропускать, но именно это и произошло.

Еще раз спасибо за ваше терпение и готовность помочь.

Это было полезно?

Решение

Я не вижу ничего плохого в вашей подготовке оператора или использовании параметров, но что-то не так в ваших результатах привязки:

http://php.net/manual/en/mysqli -stmt.bind-result.php говорит:

  

Обратите внимание, что все столбцы должны быть связаны   после mysqli_stmt_execute () и ранее   на вызов mysqli_stmt_fetch () .

(выделение мое)

<Ч>

Приведенный выше документ следует использовать как все столбцы в вашем запросе, а не как все столбцы в вашей таблице.

Хорошо, я просто попробовал это сам. Если я опущу столбец $ name , он выдаст следующее предупреждение:

PHP Warning:  mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9
PHP Stack trace:
PHP   1. {main}() /Users/bill/workspace/PHP/mysqli.php:0
PHP   2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9

Но он действительно извлекает данные.

Если я свяжу $ name и $ content с результатами запроса, он будет работать без ошибок и предупреждений.

Поэтому я вынужден спросить вас: вы уверены , есть ли в базе данных строка, соответствующая вашему состоянию? То есть где name = 'введение' ? Помните, что в SQL при сравнении строк по умолчанию учитывается регистр.

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

Другие советы

Разве это не должно быть

$stmt->bind_result($name, $content);

Когда вы выбираете 2 столбца

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top