Я использовал следующий код, чтобы сделать запрос с подготовленными операторами: Я использовал mysqli :: prepare(), а не mysqli_stmt :: prepare(), поэтому $ res не нужно инициализировать. Он возвращается mysqli :: подготовлен. php.net linkmysqli :: prepare() vs mysqli_stmt :: prepare()
$sql2 = "INSERT INTO best_scores(`user_id`, `test_id`, `score`) VALUES(?, ?, ?)";
if($res = $db->prepare($sql2) == FALSE) echo $db->error . "\n";
$res->bind_param("sii", $user_id, $_GET['test'], $max);
$res->execute();
$res->free_result();
Когда был достигнут этот код, появилась следующая ошибка:
Call to a member function bind_param() on a non-object
Я искал ответы, но все вопросы были ошибки в строке SQL запроса или они не освободили предыдущие результаты , Никто из них не помог мне, поэтому я попытался что-то изменить. Я изменил код следующим образом:
$sql2 = "INSERT INTO best_scores(`user_id`, `test_id`, `score`) VALUES(?, ?, ?)";
$res = $db->stmt_init();
if($res->prepare($sql2) == FALSE) echo $db->error . "\n";
$res->bind_param("sii", $user_id, $_GET['test'], $max);
$res->execute();
$res->free_result();
Теперь он работает. Но почему это другое? В чем была проблема с первой попыткой?
Edit: Мой объект $ дб определяется следующим образом:
$db = new mysqli("localhost", "user", "pass", "database");
if($db->connect_errno > 0) {
die('Unable to connect to database [' . $db->connect_error . ']');
}
мы можем видеть, как объявлен ваш объект $ db. –