2012-11-08 136 views
-1

感謝社區中的許多人,因此我一直試圖將所有內容切換到PDO。我有一個INSERT INTO語句,我嘗試轉換到PDO但它沒有插入。我也沒有得到任何錯誤。PDO INSERT語句未插入

這是我試圖轉換:

<?php 
session_start(); 
$con = mysql_connect("host", "username", "password", "DBname"); 
$username = $_SESSION['username']; 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("dbname", $con); 

mysql_query("INSERT INTO badge_status (username, badge1) 
VALUES ('$username', 'finished')"); 

mysql_close($con); 
?> 

PDO版本,如果你能趕上這是怎麼回事,也可以解決這個問題

<?php 
session_start(); 
$db = new PDO('mysql:host=hostname;dbname=dbname;charset=UTF-8', 'username', 'password'); 
$username = $_SESSION['jigowatt']['username']; 
$awardFinished = $db->prepare('INSERT INTO badge_status (username, badge1) VALUES ('$username', 'finished')'); 
?> 

謝謝!

+0

請閱讀使用說明書。你甚至不懂得串聯一個字符串。 –

+0

如果您使用的是非常棒的PDO,您必須**使用[SQL佔位符](http://bobby-tables.com/php)功能來正確地轉義您的數據。不要在有害的不安全的'mysql_query'風格中使用它。 – tadman

+0

我已經擁有了,如果沒有,我不會發布。手冊沒有許多人想象的那麼有用。 –

回答

10

後您$awardFinished = $db->prepare(...);準備語句,你必須執行它:

$awardFinished->execute(); 

而且,我不知道這是否只是在您的文章或實際代碼中的錯誤,但你必須無效的單引號使用這裏:

$db->prepare('INSERT INTO badge_status (username, badge1) VALUES ('$username', 'finished')'); 

無論如何,您使用的是事先準備好的聲明固定的;你不應該直接將你的變量插入到你的查詢中。

嘗試更新到:

$awardFinished = $db->prepare('INSERT INTO badge_status (username, badge1) VALUES (:username, "finished")'); 
$awardFinished->execute(array(':username' => $username)); 
+0

這工作!非常感謝。我可以用真實的有形代碼更快地學習這些東西。 10分鐘限制過後,我會接受這個答案。再次,謝謝你! –

+0

@AoiHana完全沒問題,我很高興能幫忙! – newfurniturey

2

第一個問題我看到的是你查詢的單引號,需要轉義:

'INSERT INTO badge_status (username, badge1) VALUES (\'$username\', \'finished\')'

接下來你需要execute聲明:

$awardFinished->execute();

,因爲你需要告訴PDO拋出異常這樣你沒有得到錯誤:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try { 
    // .. prepare .. 
    $awardFinished->execute(); 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 
+0

剛剛看到newfurniturey的答案......現貨 – Lex

+1

非常感謝!這也適用。非常感謝您的幫助! –