2015-01-02 80 views
-1

我發現一個很酷的AJAX教程有一個問題:它的MySQL查詢沒有更新到PDO。PDO語法錯誤

所以我試圖修復三個錯誤:mysql_insert_id(),mysql_num_rows(),mysql_fetch_array()。我在Google上搜索了所有這三個,但我顯然至少弄錯了一個。我無法確切地知道問題出在哪裏。

這是原來的代碼...

mysql_query("INSERT INTO users (id, user_name,score,category_id)VALUES ('NULL','$name',0,'$category')") or die(mysql_error()); 

$_SESSION['name']= $name; 
$_SESSION['id'] = mysql_insert_id(); 

和...

$res = mysql_query("select * from questions where category_id='$category' ORDER BY RAND()") or die(mysql_error()); 

$rows = mysql_num_rows($res); 

$i=1; 
while($result=mysql_fetch_array($res)){?> 

這是我的改造:

$stm = $pdo->prepare("INSERT INTO users (id, user_name,score,category_id)VALUES ('NULL','$name',0,'$category')"); 
$stm->execute(array(
)); 

$_SESSION['name']= $name; 
$_SESSION['id'] = lastInsertId; 

和...

$res = $pdo->prepare("select * from questions where category_id='$category' ORDER BY RAND()"); 
$res->execute(array(
)); 

$num_rows = $res->fetchColumn(); 

$i=1; 

$row = $res->fetch(PDO::FETCH_ASSOC));{?> 

任何人都可以看到我的錯誤嗎?

+0

你應該添加你得到的確切的錯誤消息。 – T0xicCode

+0

那麼你有一個隨機的'{'在最後。看起來你忘了添加一個「while」循環。 –

+0

請查看'$ _SESSION ['id'] = lastInsertId;'應該看起來像'$ _SESSION ['id'] = $ pdo-> lastInsertId();'因爲'lastInsertId'是PDO的一種方法對象 –

回答

1

你是因爲你沒有正確輸入您的查詢的SQL錯誤。

讓我們先構建SQL字符串。請注意,變量已被冒號(:)和字母數字標識替代。

$sql = "INSERT INTO users (id, user_name, score, category_id) VALUES ('NULL', :name, 0, :category)" 

然後準備它:

$stm = $pdo->prepare($sql); 

然後執行它。你傳遞值的數組,鍵上的參數名:

$stm->execute(array(
    ':name' => $name, 
    ':category' => $category, 
)); 

最後,你可以把你的會話數組中使用的值:

$_SESSION['name']= $name; 
$_SESSION['id'] = $pdo->lastInsertId; 

你必須做同樣的事情爲第二個查詢。

1
$stm = $pdo->prepare("INSERT INTO users (id, user_name, score, category_id)VALUES(NULL, :name, 0, :category)"); 


$params = array(":name" => $_SESSION['name']= $name, ":category" => $_SESSION['id'] = lastInsertId); 
$stm->execute($params); 

這應該爲第一個PDO查詢做訣竅。我將用它作爲例子來教你。

PDO準備聲明。這意味着查詢實際上是由數據庫驅動程序而不是由PHP構建的。所以在查詢中傳遞PHP參數不是要走的路。參數需要通過execute語句添加到函數中。

SQL內部,您可以參考這些參數:variable。注意冒號:。你只能使用每個變量一次!將參數作爲數組提供給函數執行,其中:variable是數組key並且與要發送到數據庫的value組合。

+1

我建議在底部提到用戶代碼。用戶忘了添加一個while循環,如果它不是固定的,它會崩潰:'$ row = $ res-> fetch(PDO :: FETCH_ASSOC)); {?>'to'while while($ row = $ res-> fetch PDO :: FETCH_ASSOC)){?>'。 –

+1

感謝您的所有提示。我認爲所有的答案都是正確的。請注意,我沒有發佈整個代碼(包括一個while循環),因爲我不想用所有代碼壓倒你。 –

1

你應該使用參數:

$stm = $pdo->prepare("INSERT INTO users (id, user_name,score,category_id) VALUES (NULL,:name ,0,:category)"); 
$stm->execute(array(
    ':name' => $name, 
    ':category' => $category 
)); 

LastInsertId是PDO

$_SESSION['name']= $name; 
$_SESSION['id'] = $pdo->lastInsertId; 

道具再使用PARAMS:

$res = $pdo->prepare("select * from questions where category_id=:category ORDER BY RAND()"); 
$res->execute(array(
    ':category' => $category 
)); 

您可以使用PDOStatement::rowCount獲得的行數:

$num_rows = $res->rowCount(); 

,最終獲取的結果:

while(false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC))) { 
    // do stuff 
} 

或在HTML輸出上下文:

<?php while(false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC))): ?> 
    <!-- html and php output code here --> 
<?php endwhile; ?>