@hooligan377

Как использовать несколько подготовленных запросов?

Есть выборка из базы:
$stmt = $mysqli->prepare("SELECT * FROM `profile` WHERE login = ?");
$stmt->bind_param("s", $login);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc();


Далее идет условия и в конце, если все верно, то мы должны обновить данные:

$stmt1 = $mysqli->prepare("UPDATE profile SET secretKey= ?,  ip= ?, agent= ? WHERE id= ?");
$stmt1->bind_param('sssi', $secret,  $ip, $agent, $user['id']);  //user['id'] - мы получаем из выборки, так что $stmt->close(); - нельзя использовать 
$stmt1->execute(); 
$stmt1->close();


А если в место это буду говнокодить:

mysqli_query($mysqli, "UPDATE `profile` SET `secretKey` = '$secret', 
                                       `agent` = '$agent',
                                       `ip` = '$ip'
                                       WHERE id = '$user[id]'");


То, все отлично работает ...

Ошибка подобного содержания: Uncaught Error: Call to a member function bind_param() on boolean in C:\index.php:140 Stack trace: #0 {main} thrown in

Возникает вопрос: как использовать два подготовленных запросов одном скрипте, не используя ->close()
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Я вам писал уже, как правильно соединяться с mysqli. Если бы не читаете ответы, которые вам пишут, то не надо засорять сайт своими вопросами.

Я попробую ещё раз: как правильно соединяться с mysqli

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

Для справки. close никакого отношения к проблеме не имеет. Можно использовать, можно не использовать. Фактически, в большинстве случаев close писать нет смысла.
И засорять код многочисленными $stmt, $stmt1, $stmt100500 тоже не имеет смысла. Если все данные из $stmt получены, то правильно будет повторно использовать переменную с таким же именем для следующего запроса.
Ответ написан
Комментировать
flapflapjack
@flapflapjack
на треть я прав
user['id'] - мы получаем из выборки, так что $stmt->close(); - нельзя использовать


Почему? О_о

Вы выше получили

$user = $stmt->get_result()->fetch_assoc();

Всё - $user вообще никакого отношения не имеет к $stmt. Это теперь просто тупо массив отдельно от БД. Хоть отключайтесь от БД - из $user никуда ничего не пропадёт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы