2011-03-10 69 views
0

我已經看了幾個小時的相同代碼,試圖找出爲什麼我的查詢不起作用。我下面列出的兩個是不工作的兩個。PDO查詢不起作用

$getRequestIdQuery = "SELECT request_id 
    FROM request_table 
    WHERE request_key = '$requestKey' 
    AND sort_order = $so"; 

$getRequestId = $pdo->prepare($getRequestIdQuery); 
$getRequestId->execute(); 
foreach($getRequestId as $idRow) 
{ 
    $requestId = $idRow['request_id']; 
} 

// This will update the ready status of the request id returned above 
$updateReadyStatusQuery = "UPDATE request_table 
    SET request_ready = 1 
    WHERE request_id = $requestId"; 
$updateReadyStatus = $pdo->prepare($updateReadyStatusQuery); 
$updateReadyStatus->execute(); 

上述情況在文件副本返回true時運行。我已經確定這是在運行,因爲在每次測試運行期間都會顯示上面的錯誤日誌。我也確定有問題的查詢工作正常,因爲我在phpmyadmin中成功運行了查詢(如錯誤日誌中顯示的那樣)。以下是上面的代碼只有這幾行代碼,可運行正常:

$checkForComposedQuery = "SELECT * 
    FROM composed_files 
    WHERE file_source_id = '$fsi' 
    AND file_number = '$fn'"; 

$checkForComposed = $pdo->prepare($checkForComposedQuery); 
$checkForComposed->execute(); 

任何提示,以什麼可能會導致這不行?如果有幫助,上述兩個片段都在foreach循環中發生。

非常感謝提前。

UPDATE:

下結合的代碼,其中包括由以下查爾斯補充建議:

$gotCopied = copy($sourceHymnFile, $destHymnFile); 

if ($gotCopied == true) { 
    error_log("The file has been successfully copied."); 

    $idRow; 
    $getRequestIdQuery = "SELECT request_id 
     FROM request_table 
     WHERE request_key = ? 
     AND sort_order = ?"; 
    $getRequestId = $pdo->prepare($getRequestIdQuery); 
    $getRequestId->execute(array($requestKey, $so)); 
    error_log("this is the value of request key : ".$requestKey); 
    // Displays correct $requestKey value 
    error_log("This is the value of sort order : ".$so); 
    // Displays correct $so value 
    $idRow = $getRequestId->fetch(PDO::FETCH_ASSOC); 
    $requestId = $idRow['request_id']; 
    error_log("This is the value of the request id : ".$requestId); 
    // No output in error log for $requestId above 

    // This will update the ready status of the request id returned above 
    $updateReadyStatusQuery = "UPDATE request_table 
     SET ready = 1 
     WHERE request_id = ?"; 
    error_log("This updates the status of the song request if the song is played : ".$updateReadyStatusQuery); 
    $updateReadyStatus = $pdo->prepare($updateReadyStatusQuery); 
    $updateReadyStatus->execute(array($requestId)); 
} 

以下爲進入正常運行正常常量:

if ($gotCopied == true) { 
    error_log("The file has been successfully copied."); 

    $idRow; 
    $getRequestIdQuery = "SELECT request_id 
     FROM request_table 
     WHERE request_key = ? 
     AND sort_order = ?"; 
    $getRequestId = $pdo->prepare($getRequestIdQuery); 
    $getRequestId->execute(array(5, 2)); 
    error_log("this is the value of request key : ".$requestKey); 
    error_log("This is the value of sort order : ".$so); 
    $idRow = $getRequestId->fetch(PDO::FETCH_ASSOC); 
    $requestId = $idRow['request_id']; 
    error_log("This is the value of the request id : ".$requestId); 
    // No output in error log for $requestId above 

    // This will update the ready status of the request id returned above 
    $updateReadyStatusQuery = "UPDATE request_table 
     SET ready = 1 
     WHERE request_id = ?"; 
    error_log("This updates the status of the song request if the song is played : ".$updateReadyStatusQuery); 
    $updateReadyStatus = $pdo->prepare($updateReadyStatusQuery); 
    // This execute works correctly if a value is set for $requestId 
    $updateReadyStatus->execute(array($requestId)); 
} 
+0

你爲什麼沒有在手動http://ru2.php.net/manual/en/pdo.query看着漂亮的樣本.PHP? – zerkms 2011-03-10 01:54:40

+0

我已經讀過幾次,但沒有看到爲什麼第二個代碼段工作,第一個沒有。有什麼我失蹤? – TomC 2011-03-10 02:01:48

+1

@ user652677:如果您不使用變量綁定:'pdo :: query()',則執行查詢會更簡單更好。用它來解決你的問題。在你的特定情況下,儘管我最好綁定'$ fsi'和'$ fn'變量。 – zerkms 2011-03-10 02:03:46

回答

2

你有兩個問題這裏。

首先,佔位符和綁定。你的代碼很容易被SQL注入。 PDO包含一個工具來幫助減輕這種威脅。

$getRequestIdQuery = "SELECT request_id 
    FROM request_table 
    WHERE request_key = ? -- new! 
    AND sort_order = ?"; 

$getRequestId = $pdo->prepare($getRequestIdQuery); 
$getRequestId->execute(array($requestKey, $so)); 

查詢中的?是佔位符。傳遞給execute的數組提供了任何佔位符的替換列表。它們會根據需要自動轉義並引用。

其次,您檢索結果不正確。您需要在語句句柄上調用fetch method(或fetchAll method)。例如:

$idRow = $getRequestId->fetch(PDO::FETCH_ASSOC); 
$requestId = $idRow['request_id']; 

請注意,這裏沒有循環。你以前的循環會預期有多個結果,但它會在每個循環中重寫相同的變量。看起來你只需要一個結果,所以你只需要擔心一個結果。

我們還應該更新您的其他查詢以使用佔位符。

$updateReadyStatusQuery = "UPDATE request_table 
    SET request_ready = 1 
    WHERE request_id = ?"; 
$updateReadyStatus = $pdo->prepare($updateReadyStatusQuery); 
$updateReadyStatus->execute(array($requestId)); 

...和你的第三個......

$checkForComposedQuery = "SELECT * 
    FROM composed_files 
    WHERE file_source_id = ? 
    AND file_number = ?"; 

$checkForComposed = $pdo->prepare($checkForComposedQuery); 
$checkForComposed->execute(array($fsi, $fn)); 
+0

謝謝你的迴應。我已經嘗試過你的建議,但我仍然有同樣的問題。如果我在響應中放置頂部查詢的常量,即WHERE request_key = 5 AND sort_order = 2,則輸出相對於輸入的兩個常量是正確的。第二個查詢中存在問題,這是正確的。當變量被引入時有問題。我一次又一次地檢查變量名稱,甚至錯誤地將它們的值記錄在查詢下面。有什麼想法嗎? – TomC 2011-03-10 16:02:22

+0

語句對象有一個'queryString'屬性,它應該是針對服務器運行的查詢。嘗試檢查該屬性以查看它是否可以幫助您調試問題。 – Charles 2011-03-10 16:26:17

+0

我放了一個錯誤日誌來顯示準備好的pdo語句的queryString,它顯示爲它應該(假設應該保留問號)。它仍然是一個謎。任何可能的替代建議? – TomC 2011-03-10 19:40:08