2014-01-27 4 views
1

Я использовал следующий код, чтобы сделать запрос с подготовленными операторами: Я использовал 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 . ']'); 
} 
+0

мы можем видеть, как объявлен ваш объект $ db. –

ответ

3

Как мы обсудим это в комментариях, это может быть неправильно отведение в if() блоке.

Что я тестировал.Если блок, как у вас:

$x = (object)array('a'=>'b'); 

if ($a = $x == false) { 
    echo 'a'; 
} 

var_dump($a); 

Выход:

булевы ложные

Тогда я положил скобки вокруг свиданий:

$x = (object)array('a'=>'b'); 


if (($a = $x) == false) { 
    echo 'a'; 
} 

var_dump($a); 

Выход:

объект (StdClass) [1] общественность 'а' => строка 'Ъ' (длина = 1)

так что вам будет нужно поставить скобки вокруг передачи имущества за $ Рез

if(($res = $db->prepare($sql2)) == FALSE) 

Потому что ваш путь, вы ошибочно переназначаете $ res до FALSE, и объект был утерян

+0

Вы правы.Я помещаю круглые скобки, и первая версия работает. Я также проверил здесь: http://www.php.net/manual/en/language.operators.precedence.php, а оператор == имеет более высокий приоритет, чем =. Спасибо!! – Sorin

1

Вы проверить, если ваш db-> подготовка работала в первом примере, и если он не используется $ Рез в любом случае, который теперь не является объектом, потому что он не был инициализирован. Во втором примере вы сначала объявляете и инициализируете его.

+0

Это правда, но это не операция назначения, независимо от того, действительно ли true/false ' $ res = ... 'is –

+0

Где находится $ db-> stmt_init(); в первом примере? – drw85

+0

О, неважно, нашел. Моя ошибка –

1

В Документах:

mysqli_stmt_init - инициализация заявления и возвращает объект для использования с mysqli_stmt_prepare

в вас ПРЕД код вы не настроите. во втором фрагменте кода после инициализации он работал.

Ссылка: http://www.php.net/manual/en/mysqli.stmt-init.php

+0

У него есть '$ res = $ db-> prepare ($ sql2)', который в соответствии с подготовкой docs ('if ($ stmt = $ mysqli-> prepare (" SELECT District FROM City WHERE Name =? ")) {') в порядке? –

+0

, если вы видите эту ссылку на сайте php http://www.php.net/manual/en/mysqli-stmt.prepare.php, они сначала инициализируются. подготовка используется после инициализации. –

+0

Правильно, я не видел этого в первый раз. Извините об этом –

Смежные вопросы