Запрос с использованием результата предыдущего запроса

У меня есть следующий код:

$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 и т. Д.).