尽管预处理语句正确,但php pdo查询无法返回结果

时间:2014-09-12 11:00:55

标签: php mysql pdo

我有以下php / pdo调用一个mysql过程,该过程返回一个文件名,但是尽管准备好的语句是正确的并且从剪切和粘贴的数据库查询中返回以下内容:

db query / result

>     call sp_CDRbyCustomer('Wind', 'R2X', DATE(DATE_SUB(NOW(), INTERVAL 10 WEEK)), DATE(NOW()));
>     +------------------------------------------------------+
>     | Exported filename                                    |
>     +------------------------------------------------------+
>     | '/tmp/CDR_for_Wind_20140704-20140912_1410516460.csv' |
>     +------------------------------------------------------+
>     1 row in set (0.02 sec)

php / pdo

应返回我们的文件名:

include('db.ini');

define('DEBUG', true);
if (DEBUG ) {
        openlog("$iam", LOG_PID | LOG_ODELAY,LOG_LOCAL4);
        syslog(LOG_INFO, "START OF DEBUG LOG.");
}

/***** connect to database using db.ini for credentials *****/
try {
$dbConn =  new PDO('mysql:host='.$host.';dbname='.$db, $dbUser, $dbPass, array (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION));

} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

$structure_name = "'Wind'";
$cug_uid = "'R2X'";
$num_weeks = 10;

/**** Query - export file name ****/
$sqlQuery4filename = ("
call sp_CDRbyCustomer($structure_name, $cug_uid, DATE(DATE_SUB(NOW(), INTERVAL $num_weeks WEEK)), DATE(NOW()))
");
$sqlQuery4filename = preg_replace( "/\r|\n/", "", $sqlQuery4filename );

    debug("01: sqlQueryfile string is '" . $sqlQuery4filename . "'");
    $stmnt = $dbConn->prepare($sqlQuery4filename);
    debug($stmnt);
    $stmnt->execute();
    $stmnt->closeCursor();
    $filename = $stmnt->fetch(PDO::FETCH_ASSOC);
    $filename = $filename['Exported filename'];
    debug("01: filename string is '" . $filename . "'");

function debug($debug) {
if(!DEBUG) return;

print '
<div class="debug">
';
print_r($debug);
print '
</div><!-- end of debug -->
';
}

但是我只返回一个空字符串。

我有这个工作,但是在颠覆之后我最终得到了错误的版本并且再也无法让它工作了,任何人都给我任何线索来解决我做错了什么。

3 个答案:

答案 0 :(得分:0)

您需要正确调试:

  1. 查看您执行的确切SQL命令(我无法从您的问题中说出来)。
  2. 针对数据库测试命令,例如使用PHPmyAdmin。
  3. 在以阵列形式访问fetch()之前显示{{1}}结果。
  4. 如果您从开始到结束都遵循PHP执行试验,那么您应该能够找出出错的地方。

答案 1 :(得分:0)

您需要绑定输出参数。请参阅文档http://php.net/manual/en/pdo.prepared-statements.php

中的示例#4
<?php
$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

// call the stored procedure
$stmt->execute();

print "procedure returned $return_value\n";
?>

答案 2 :(得分:0)

经过多次调试和许多不同的编码尝试后,我最终检索了所需的结果。

我尝试过多次尝试使用binParam,但返回的结果总是一个空字符串。

我已经更改为mysql过程以输出所需的文件名,因此mysql命令SELECT @filename将提供所需的结果。

然后,我使用以下内容检索此值:

   /**** Query - export file name ****/
   $sql = 'call sp_CDRbyCustomer( \'' . $structure_name . '\', \'' . $cug_uid . '\', DATE(DATE_SUB(NOW(), INTERVAL ' . $num_weeks . ' WEEK)), DATE(NOW()),  @filename )';

    $stmnt = $dbConn->prepare($sql);
    debug($stmnt);
    $stmnt->execute();
    $stmnt->closeCursor();
    $filename_result = $dbConn->query("select @filename")->fetch();
    $filename = $filename_result['@filename'];          

我不确定这是否是最好的方法,但它确实产生了我想要的结果: - )