2013-06-28 4 views
0

Я пытаюсь понять, почему мой первый отчет о подготовке работает очень хорошо, но мой второй нет. Фактический синтаксис INSERT INTO выглядит корректно и работает, когда я заменяю числа и размещаю их в консоли mysql, но оператор prepare возвращает false.Ошибка в mysqli-> make with insert statement

Просто, чтобы убрать простые вопросы; $ db_table_prefix == "uc_", и все переменные инициализируются. Кроме того, первый оператор устанавливает $ results == 0 (EDIT: это была моя ошибка, это действительно 0, а не 1).

global $mysqli,$db_table_prefix; 

$stmt = $mysqli->prepare("SELECT COUNT(id) FROM ".$db_table_prefix."attempts WHERE ((exp_m = ?) AND (exp_n = ?) AND (max_base <= ?))"); 
$stmt->bind_param("iii", $m, $n, $this->max_base); 
$stmt->execute(); 
$stmt->bind_result($results); 
$stmt->fetch(); 

if ($results < 1) 
{ 
    $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."attempts (exp_m, exp_n, base_x, max_base) VALUES (?,?,?,?)"); 
    $stmt->bind_param("iiii", $m, $n, $x, $this->max_base); 

    ..... 
} 

Я включил структуру таблицы, на всякий случай это проблема.

mysql> describe uc_attempts; 
+----------+---------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+---------------------+------+-----+---------+----------------+ 
| exp_m | bigint(20) unsigned | NO |  | NULL |    | 
| exp_n | bigint(20) unsigned | NO |  | NULL |    | 
| base_x | bigint(20) unsigned | YES |  | NULL |    | 
| max_base | bigint(20) unsigned | NO |  | NULL |    | 
| id  | int(11)    | NO | PRI | NULL | auto_increment | 
+----------+---------------------+------+-----+---------+----------------+ 

Я уверен, что я просто отсутствует что-нибудь простое, но через несколько дней глядя на код, я должен спросить. Заранее спасибо за помощь. Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которую я должен включить.

+1

Какая ошибка? – Jim

+0

Во второй инструкции подготовки он возвращает False. – Joe

+0

Включить отчет об ошибках и посмотреть, выбрасывает ли он исключение – naththedeveloper

ответ

1

Вы забыли закрыть первый ресурс. Я считаю, что он не может открыть второй подготовленный отчет, если первый не закрыт. Я думаю, $mysqli->prepare(...); затем вернет false, и, очевидно, false->bind_param(...); не существует ;-) вызывает Fatal error: Call to a member function bind_param() on a non-object -error.

global $mysqli,$db_table_prefix; 

$stmt = $mysqli->prepare("SELECT COUNT(id) FROM ".$db_table_prefix."attempts WHERE ((exp_m = ?) AND (exp_n = ?) AND (max_base <= ?))"); 
$stmt->bind_param("iii", $m, $n, $this->max_base); 
$stmt->execute(); 
$stmt->bind_result($results); 
$stmt->fetch(); 
$stmt->close(); //<-- this is the problem 

if ($results < 1) 
{ 
    $stmt = $mysqli->prepare("INSERT INTO ".$db_table_prefix."attempts (exp_m, exp_n, base_x, max_base) VALUES (?,?,?,?)"); 
    $stmt->bind_param("iiii", $m, $n, $x, $this->max_base); 

    ..... 
} 
+0

Вы, сэр/мадам, гений. Я смотрел на это уже два дня. Большое вам спасибо за вашу помощь и спасибо всем остальным. – Joe

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

  • Нет связанных вопросов^_^