2011-08-21 88 views
0

好吧我有一個名爲dbc.php的文件在我的WAMP服務器上運行。在該文件中,我運行以下PDO聲明:這個PDO查詢有什麼問題?

<?php 
    require('dbc.php'); 

    $q = $dbc -> prepare(
       "INSERT INTO accounts 
        (fname, lname, email, password, username, gender) 
        VALUES 
        (?, ?, ?, ?, ?, ?)" 
       ); 
    $q -> execute(
      array(
       $_POST['fname'], 
       $_POST['lname'], 
       $_POST['email'], 
       $_POST['password'], 
       $_POST['username'], 
       $_POST['gender'] 
      ) 
     ); 
?> 

我有雙重檢查,要與數據庫的連接工作正常,我有雙重檢查我的領域在MySQL。我不知道問題出在哪裏,但這可能很簡單,這裏很晚。

+2

請界定 「不工作」。它只是沒有插入任何東西,或者你會得到錯誤? – deceze

+0

沒有錯誤,沒有插入,我已經做了很多次,沒有錯誤! – Carl

+0

您是否檢查過從$ _Post數組獲得的索引中是否存在有效數據? – F21

回答

3

這裏沒有很多去這裏,所以讓我在你扔了一堆東西,看看枝。

首先,你說這個代碼不發出任何錯誤,但它也沒有將你的數據到數據庫中。

PDO有發出錯誤的幾種不同的方式。它可以返回錯誤代碼,拋出E_WARNING錯誤,或者發出PDOException例外。默認情況下,PDO將默默設置錯誤代碼。您需要在正在操作的對象上撥打errorCode()errorInfo()

在你的情況,你的代碼應該看起來有點像這樣簡單的例子:

$q = $dbc->prepare(...); 

if ($q->errorCode) { 
    // Display error message 
} 

$q->execute(...); 

if ($q->errorCode) { 
    // Display error message 
} 

這樣,如果你在你的SQL或與您的數據有錯誤,PHP/PDO將顯示一個友好的錯誤給你的消息。

您還可以設置其他錯誤模式之一,當您創建PDO對象:

try { 
    $dbh = new PDO(DB_DSN, 
       DB_USER, 
       DB_PASS, 
       array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) 
      ); 
} catch (PDOException $e) { 
    echo "Connection failed: " . $e->getMessage(); 
} 

如果設置ERRMODE_EXCEPTION,那麼你就可以創建一個try/catch塊,如上圖所示呼應了錯誤發生異常時的消息。同樣,如果將error_reporting()設置設置得足夠高,則PHP將發出錯誤消息ERRMODE_WARNING

如果您使用的是ERRMODE_WARNING,則需要確保您的PHP設置爲報告E_WARNING錯誤。我始終建議使用error_reporting(E_ALL | E_STRICT);進行開發,但只要您設置了E_WARNING,您應該在此模式下看到PDO錯誤。

請確保您報告錯誤,並更新你看到確切的錯誤信息你的問題。我發現很難相信那些代碼在沒有錯誤的情況下執行而沒有插入任何數據。

說了這麼多,如果你沒有得到任何錯誤,你不插入數據時,它可能是一個好主意,檢查您的代碼,以確保即使是在執行你的問題的代碼。它可能被一個失敗的if條件或其他東西繞過。

最後,您應該檢查您在代碼中使用的每個$_POST索引,以確保它們擁有一個值,並且該值是適合您的SQL的類型。使用尚未設置的$_POST索引應該會引發錯誤(E_NOTICE,IIRC),但是您的error_reporting()級別也可能太低而無法確定。

你可以嘗試這樣的事:

$postIndexes = array(
       "fname", "lname", "email", 
       "password", "username", "gender" 
       ); 

foreach ($postIndexes as $index) { 
    $missingIndexes = array(); 
    if (!isset($_POST[$index] || empty($_POST[$index])) { 
    $missingIndexes[] = $index; 
    } 
    if ($missingIndexes) { 
    echo "The following required indexes were missing:\n"; 
    echo "<ul>\n"; 
    foreach ($missingIndexes as $index) { 
     echo "<li>" . $index . "</li>\n"; 
    } 
    echo "</ul>\n"; 
    } 
} 
+0

好的,現在就把它放在它上面,會讓你貼出來,謝謝... – Carl