PHP PDO奇怪的行为:在结果数组中获取空字符串10次中的1次

PHP PDO奇怪的行为:在结果数组中获取空字符串10次中的1次,php,mysql,pdo,Php,Mysql,Pdo,比如10次MySQL->PDO中有1次回复的数组元素数量正确,但都是空的。 其他~9次我在同一个查询中得到正确的结果 (我被迫使用的PHP版本是5.3.1,MySQL版本是5.1.41) 我的php函数: function getClientsByLike($dbh, $term) { $k=$dbh->prepare(" SELECT code, text FROM my_table WHERE text LIKE :search_term

比如10次MySQL->PDO中有1次回复的数组元素数量正确,但都是空的。 其他~9次我在同一个查询中得到正确的结果

(我被迫使用的PHP版本是5.3.1,MySQL版本是5.1.41)

我的php函数:

function getClientsByLike($dbh, $term)
{   

    $k=$dbh->prepare("
        SELECT code, text FROM my_table WHERE text LIKE :search_term
        ORDER BY text ASC
        LIMIT 500
    ");

    $k->bindParam(":search_term", $x = "%".$term."%");
    $k->execute();

    while($obj = $k->fetch())
    {
        $result.= $obj['code'].' '.$obj['text'].'<br />';
    }

    return $result;
}


$dbh = new PDO('mysql:host=localhost;dbname=my_db', 'my_user', 'my_password', 
    array( 
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    )
);

echo getClientsByLike($dbh, "term");
函数getClientsByLike($dbh,$term) { $k=$dbh->准备(“ 从my_表格中选择代码、文本,其中的文本类似于:search_term 按文本排序ASC 限额500 "); $k->bindParam(“:search_term”,$x=“%”“%.”$term.%”; $k->execute(); 而($obj=$k->fetch()) { $result.=$obj['code'].'.$obj['text'.].
; } 返回$result; } $dbh=new-PDO('mysql:host=localhost;dbname=my_-db','my_-user','my_-password',', 数组( PDO::ATTR_PERSISTENT=>true, PDO::ATTR_ERRMODE=>PDO::ERRMODE_警告, PDO::MYSQL_ATTR_INIT_命令=>'SET NAMES utf8', PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC ) ); echo getClientsByLike($dbh,“术语”); 在它工作的时候,我得到了这样的结果:

434 textblabla<br />
23 moretext<br />
95 evenmoretext<br />
434 textblabla
23更多文本
95 evenmoretext
当它不起作用时,我会得到正确数量的结果,但所有返回的字符串都是空的:

 <br />
 <br />
 <br />



有时,该行为与脚本的每次执行交替进行:工作、不工作、工作、不工作,等等

我现在和PDO一起工作了相当长的时间(大约3个月),但这是我第一次遇到这种奇怪的行为


非常感谢您的任何建议

我不确定您遇到了什么错误。也许你可以尝试用PDOException包装你的prepare和execute方法,也许你知道原因

try{ 
$k=$dbh->prepare("
        SELECT code, text FROM my_table WHERE text LIKE :search_term
        ORDER BY text ASC
        LIMIT 500
    ");

    $k->bindParam(":search_term", $x = "%".$term."%");
    $k->execute();
}catch(PDOException $e){
    echo "<p style='color:red;'>{$e->getMessage()}</p>";
}
试试{
$k=$dbh->准备(“
从my_表格中选择代码、文本,其中的文本类似于:search_term
按文本排序ASC
限额500
");
$k->bindParam(“:search_term”,$x=“%”“%.”$term.%”;
$k->execute();
}捕获(PDO$e){
echo“

{$e->getMessage()}

”; }
使用此方法进一步调试脚本后:

$clients = $k->fetchAll();

ob_start();
var_dump($clients);
$debug = ob_get_clean();

file_put_contents("result.txt", $debug."\r\n", FILE_APPEND);
注意:我现在切换到
fetchAll()

我已经找到了这种奇怪行为的原因,但仍然不清楚为什么会发生这种行为

我查看了为结果数组PDO返回创建的日志文件:

适用于我的结果数组:

array(1) {
  [0]=>
  array(2) {
    ["code"]=>
    string(5) "31081"
    ["text"]=>
    string(28) "some text here"
  }
}
产生奇怪行为的结果数组:

array(1) {
  [0]=>
  array(2) {
    ["my_table.code"]=>
    string(5) "31081"
    ["my_table.text"]=>
    string(28) "some text here"
  }
}
因此,PDO突然回复为
“表名”。“字段名”
,而不是像预期的那样只回复
“字段名”
。我不会在任何地方更改任何PDO设置,它们始终保持不变。 PDO的行为——有时使用表名进行应答,有时不使用表名——看起来非常随机,对我来说是一个严重的bug(至少在PHP5.3.1中是这样)

显式地将PDO设置为从不获取表名(在此脚本中)应该可以解决这一问题:

$dbh->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, false);

生成异常以找出问题。谢谢,但我的代码没有生成任何错误或警告。我想,否则我不会收到大小正确但没有内容的结果集。首先,hes PDO不会抛出异常,因此没有什么可捕获的。第二,永远不要做类似于回显错误消息这样的事情。当然,您应该在开发过程中回显错误!在开发过程中手动回显错误有什么意义?谢谢,但我的代码不会产生任何错误或警告。我想,否则我将不会收到大小正确但没有内容的结果集。