У меня есть следующий код:
/* Get the 10 latest posts from users you're following */ $stmt = $cxn->prepare('SELECT * FROM posts WHERE user_id IN (SELECT following_id FROM follows WHERE user_id = ?) ORDER BY datetime DESC LIMIT 15'); $stmt->bind_param('i', $user_id); $stmt->execute(); $result = $stmt->get_result(); /* If a result exists, continue. */ if ($result->num_rows) { while ($row = $result->fetch_assoc()) { /* Get the user's username from their id */ $stmt = $cxn->prepare('SELECT username FROM users WHERE user_id = ?'); $stmt->bind_param('i', $row['user_id']); $stmt->execute(); $stmt->bind_result($username); $stmt->fetch(); $stmt->close(); // this is where I'm closing the connection } }
В третьей последней строке вы заметите, что я закрываю соединение в цикле while. Проблема в том, что если я удалю эту строку, я получу ошибку. Fatal error: Call to a member function bind_param() on a non-object
в этой строке.
Я предполагаю, что закрытие соединения, а затем повторное открытие его снова для следующего элемента в цикле не очень хорошо. Итак, как я могу это исправить? Почему я получаю эту ошибку при удалении закрытой линии соединения?
Пожалуйста помоги.
Это пример, который я привел в один из моих репозиториев Github, который решает эту проблему:
$Query = $Database->prepare("FIRST QUERY"); $Query->execute(); $Query->bind_result($ID,$Password); $Query->store_result(); while ($Query->fetch()){ $Secondary_Query = $Database->prepare("SECOND QUERY"); $Secondary_Query->bind_param(); $Secondary_Query->execute(); $Secondary_Query->close(); } $Query->close();
Измените это в соответствии с вашим рабочим сценарием, и у вас будет успешный текущий запрос
Вы можете попробовать что-то вроде ниже:
/* Get the 10 latest posts from users you're following */ $stmt = $cxn->prepare('SELECT * FROM posts WHERE user_id IN (SELECT following_id FROM follows WHERE user_id = ?) ORDER BY datetime DESC LIMIT 15'); $stmt->bind_param('i', $user_id); $stmt->execute(); $result = $stmt->get_result(); /* If a result exists, continue. */ if ($result->num_rows) { while ($row = $result->fetch_assoc()) { /* Get the user's username from their id */ $stmt = $cxn->prepare('SELECT username FROM users WHERE user_id = ?'); $userid = (int)$row['user_id']; $stmt->bind_param('i', $userid); // Forcing $row['user_id'] to int $stmt->execute(); $stmt->bind_result($username); $stmt->fetch(); //$stmt->close(); Don't close it here } } $stmt->close();
Другой подход, но требует гораздо больше времени:
/* Get the 10 latest posts from users you're following */ $stmt = $cxn->prepare('SELECT * FROM posts WHERE user_id IN (SELECT following_id FROM follows WHERE user_id = ?) ORDER BY datetime DESC LIMIT 15'); $stmt->bind_param('i', $user_id); $stmt->execute(); $result = $stmt->get_result(); /* If a result exists, continue. */ if ($result->num_rows) { while ($row = $result->fetch_assoc()) { /* Get the user's username from their id */ $stmt_loop = $cxn->prepare('SELECT username FROM users WHERE user_id = ?'); $userid = (int)$row['user_id']; $stmt_loop->bind_param('i', $userid); // Forcing $row['user_id'] to int $stmt_loop->execute(); $stmt_loop->bind_result($username); $stmt_loop->fetch(); $stmt_loop->close(); //Close the local stmt here } } $stmt->close();