2013-06-28 69 views
0

我想弄清楚爲什麼我的第一個準備語句工作得很好,但是我的第二個沒有。實際的INSERT INTO語法看起來是正確的,當我替換數字並將其放置在一個mysql控制檯中時,但是prepare語句返回false。在mysqli->使用插入語句準備中的錯誤

只是爲了清除簡單的問題; $ db_table_prefix ==「uc_」並且所有變量都被初始化。另外,第一個語句設置$ results == 0(編輯:這是我的錯誤,它真的是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-錯誤。

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