PHP PDO奇怪的行为:在结果数组中获取空字符串10次中的1次
比如10次MySQL->PDO中有1次回复的数组元素数量正确,但都是空的。 其他~9次我在同一个查询中得到正确的结果 (我被迫使用的PHP版本是5.3.1,MySQL版本是5.1.41) 我的php函数: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
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不会抛出异常,因此没有什么可捕获的。第二,永远不要做类似于回显错误消息这样的事情。当然,您应该在开发过程中回显错误!在开发过程中手动回显错误有什么意义?谢谢,但我的代码不会产生任何错误或警告。我想,否则我将不会收到大小正确但没有内容的结果集。