2011-03-10 92 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