Подготовленный PHP оператор возвращает -1 - PullRequest
1 голос
/ 31 марта 2010

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

Теперь я пытаюсь:

$sql="SELECT PhotoID,Caption FROM Photos WHERE EntityID=? AND TypeID=? LIMIT ?,?";

$iDB = new mysqliDB(); // Extends mysqli

$stmt = $iDB->prepare($sql);

$stmt->bind_param('iiii',$entityID,$typeID,$minRange,$maxRange);

$stmt->execute();

$stmt->bind_result($photoID,$caption);

echo("Affected={$stmt->affected_rows}");

Это печатает -1. Я трижды проверил, что все 4 значения в bindParam установлены, и что SQL-запрос работает при вставке в myAdmin с соответствующими значениями.

Есть идеи, что может быть причиной этого?

Edit :: Я нашел ответ в Интернете, по-видимому, мне нужно использовать $ stmt-> store_result (); после выполнения .. но я не уверен, что это нужно сейчас и никогда прежде ..

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Каждая функция / метод mysqli может завершиться с ошибкой. В зависимости от того, как вы расширили class mysqli, вам, вероятно, придется проверять каждое возвращаемое значение. Если метод возвращает false, произошла ошибка, и сообщение об ошибке сохраняется в свойстве объекта mysqli или оператора.

$sql="SELECT PhotoID,Caption FROM Photos WHERE EntityID=? AND TypeID=? LIMIT ?,?";

$iDB = new mysqliDB(); // Extends mysqli
if ($iDB->connect_error) {
  printf('connect error (%d) %s', $iDB->connect_errno, htmlspecialchars($iDB->connect_error));
  die;
}

$stmt = $iDB->prepare($sql);
if ( false===$stmt ) {
  printf('prepare failed: %s', htmlspecialchars($iDB->error));
  die;
}

$rc = $stmt->bind_param('iiii',$entityID,$typeID,$minRange,$maxRange);
if ( false===$rc ) {
  printf('bind_param failed: %s', htmlspecialchars($stmt->error));
  die;
}

$rc = $stmt->execute();
if ( false===$rc ) {
  printf('execute failed: %s', htmlspecialchars($stmt->error));
  die;
}

$rc = $stmt->bind_result($photoID,$caption);
if ( false===$rc ) {
  printf('bind_result failed: %s', htmlspecialchars($stmt->error));
  die;
}

// echo("Affected={$stmt->affected_rows}");
1 голос
/ 31 марта 2010

Из документации mysqli_stmt->affected_rows:

Эта функция работает только с запросами, которые обновляют таблицу . Чтобы получить количество строк в запросе SELECT, используйте mysqli_stmt_num_rows().

Таким образом, вы можете использовать этот метод только с запросом UPDATE или DELETE.

Кроме того:

Возвращаемые значения Целое число больше нуля указывает количество затронутых или найденных строк. Ноль указывает, что ни одна запись не была обновлена ​​для оператора UPDATE / DELETE, ни одна строка не соответствует предложению WHERE в запросе или что еще не было выполнено ни одного запроса. -1 означает, что запрос вернул ошибку . NULL указывает на то, что в функцию был передан неверный аргумент.

Но это также может означать, что он возвращает -1, потому что вы пытаетесь использовать его для SELECT оператора. Попробуйте mysqli_stmt_num_rows().

Обновление:

Пример страницы, на которую я ссылался:

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20";
if ($stmt = $mysqli->prepare($query)) {

    /* execute query */
    $stmt->execute();

    /* store result */
    $stmt->store_result();

    printf("Number of rows: %d.\n", $stmt->num_rows);

    /* close statement */
    $stmt->close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...