2014-09-12 72 views
1

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

DB查询/结果

>  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

应返回我们的FIL ename是:

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 --> 
'; 
} 

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

我已经有这个工作,但在颠覆它后,我结束了错误的版本,不能再得到它的工作,任何人给我任何线索,我做错了什么。

+0

要使结果这个更清楚,上面的sql过程调用是'cut'和'paste'从'debug($ stmnt);'的结果。然后我们运行'$ stmnt-> execute();'和'$ stmnt-> closeCursor();'但是'$ stmnt-> fetch(PDO :: FETCH_ASSOC);'返回空。 – 2014-09-12 11:19:39

回答

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'];   

我不知道这是否是做到这一点的最好方式,但它确实能产生我渴望:-)

0

您需要正确调试此:

  1. 看到确切的SQL命令你执行(我无法从你的问题告诉)。
  2. 测试针对数据库的命令,例如使用PHPmyAdmin。
  3. 显示fetch()的结果,然后以数组的形式访问它。

如果您从开始到结束遵循PHP执行试用版,您应该能够确定它出错的位置。

0

您需要绑定输出参数。见例#4中的文档http://php.net/manual/en/pdo.prepared-statements.php

<?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"; 
?>