У меня есть следующий код:
$stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?'); $stmt->bind_param("i", $number); $stmt->execute(); $stmt->bind_result($result); while($stmt->fetch()) { $stmt = $cxn->prepare('SELECT value FROM table2 WHERE column = ?'); $stmt->bind_param("i", $result); // error on this line $stmt->execute(); $stmt->bind_result($result2); $stmt->fetch(); }
Я хочу использовать результат из первого запроса во втором запросе , однако я получаю следующую ошибку в строке $stmt->bind_param("i", $result);
:
Fatal error: Call to a member function bind_param() on a non-object
Что не так?
Второй вызов $cxn->prepare
возвращает false
или null
. Другими словами, второй запрос не создает заявление. Как упоминалось в одном из комментариев, это может быть связано с использованием зарезервированного слова ( table
), синтаксической ошибки или из-за истечения времени соединения и т. Д.
Предполагая, что это что-то вроде PDO
, вам нужно проверить, что ваши призывы к prepare
возвращают заявление:
<?php $stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?'); if (!$stmt) { // do something to deal with the failure // throw new \Exception('Could not create statement'); } $stmt->bind_param("i", $number); $stmt->execute(); $stmt->bind_result($result); while($stmt->fetch()) { $stmt = $cxn->prepare('SELECT value FROM table2 WHERE column = ?'); if (!$stmt) { // failed, handle it // throw new \Exception('Could not create statement'); } $stmt->bind_param("i", $result); // error on this line $stmt->execute(); $stmt->bind_result($result2); $stmt->fetch(); }
Или вы можете настроить режим ошибок PDO, чтобы генерировать исключения и catch
когда что-то идет не так.
<?php $cxn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); // after the above, failing calls to $cnx->prepare will throw exceptions
Если это PDO, вы можете использовать PDO::errorInfo
и PDO::errorCode
для отслеживания вашей проблемы:
<?php $stmt = $cxn->prepare('SELECT value FROM table WHERE column = ?'); if (!$stmt) { var_dump($cxn->errorInfo()); return; }
errorInfo
вернет вам массив с кодом SQLSTATE в качестве первого элемента, код ошибки, специфичный для драйвера, как второй, и фактическое сообщение об ошибке как третье. Это место, чтобы начать поиск, почему ваши запросы терпят неудачу. Если вы установите соединение для исключения исключений, то само исключение будет иметь необходимую вам информацию ( PDOException::getMessage
, PDOException::$errorInfo
и т. Д.).