PDO 准备和执行查询总是返回错误
Posted
技术标签:
【中文标题】PDO 准备和执行查询总是返回错误【英文标题】:PDO prepare and execution of query returns always error 【发布时间】:2016-08-29 21:22:14 【问题描述】:我有一个函数,
这总是返回给我一个错误,即使在我过去查询时在 phpmyadmin 中有一个结果。
我想我的查询有问题,但我不知道是什么。我以前做我的代码做mysql_real_escape_string,然后我转向PDO,他们告诉我应该为转义GET vars做准备,所以我试着去做。
以下是我的查询
public static function getDetailService($param)
global $bdd;
$detail = $bdd->prepare('SELECT
spb_services.spb_services__name,
spb_services.spb_services__description,
spb_services.spb_services__banner,
spb_services.spb_services__tabs,
spb_services.spb_services__category
FROM spb_services
WHERE spb_services.spb_services__name LIKE :service');
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
//var_dump($_GET[$param]);
$detail->debugDumpParams();
$lignes = $detail->fetchColumn();
//var_dump($lignes);
$detail = $detail->fetchAll(PDO::FETCH_ASSOC);
$retour = ($lignes > 0) ? array('status' => 'ok') : array('status' => 'error');
var_dump($retour);
当我调用函数时:$service = nosServices::getDetailService('service');
var_dump($_GET[$param])
的 Var 转储返回给我预期的内容(来自 url)
然后我做了$detail->debugDumpParams();
我在我的本地主机 phpmyadmin 中通过了查询,它返回给我预期的结果,但在使用 PDO 时没有。
我猜有些小问题是错的,但我不知道是什么。
这不会返回错误,但总是错误,好像没有num_rows_result
总结一下麻烦,GET返回了预期的结果,但是当我们去查询时,它没有返回任何结果(除了在我的phpmyadmin复制并粘贴查询)
我们将不胜感激任何帮助
编辑:其他用户按预期完成的修改
【问题讨论】:
":service"
去掉这里的双引号。在bindValue
中,在service
之前添加:
我还有一个错误
你错过了$detail->execute()
。您需要在 fetchAll 之前执行查询
人们对绑定中的冒号有误解,它只在值中是必需的。自己阅读***.com/q/9778887
@StanislasPiotrowski 您需要在此处检查错误。所以使用php.net/manual/en/function.error-reporting.php 和php.net/manual/en/pdo.error-handling.php 看看是否有任何结果,除了你没有执行查询。
【参考方案1】:
参数绑定需要修正。
您在为参数提供值时缺少:
。
更正的代码:
...
WHERE spb_services.spb_services__name LIKE :service');
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
...
【讨论】:
感谢您的帮助,我这样做了,但仍然没有结果 首先,OP 必须删除一些引号。 我这样做是为了删除引号 冒号不是问题,驱动程序自动附加它。 ***.com/questions/9778887/…(跟随源代码链接)占位符不会被引用。【参考方案2】:只有代码中的问题忘记在获取数据之前执行查询它会是
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
$detail->execute();// execute it first
$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
print_r($resultat);
【讨论】:
我做了所有的修改,但它仍然不起作用,我想我在其他地方错了 我做了$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR); $detail->execute(); // execute it first $lignes = $detail->fetchColumn(); $resultat = $detail->fetchAll(PDO::FETCH_ASSOC); //var_dump($_GET[$param]); // $detail->debugDumpParams(); //var_dump($lignes); $retour = ($lignes > 0) ? array('status' => 'ok') : array('status' => 'error'); var_dump($retour);
我有一个错误
在绑定中不需要冒号,只需要值,这里是***.com/q/9778887
@StanislasPiotrowski 仍然没有在获取数据之前执行查询
我试过这个`$detail->bindValue('service', $_GET[$param], PDO::PARAM_STR); $详细信息->执行(); // 先执行 $lignes = $detail->fetchColumn(); $resultat = $detail->fetchAll(PDO::FETCH_ASSOC);` 但我仍然有错误【参考方案3】:
您的代码中发生了许多奇怪的事情。
我已经评论了我认为需要改变的地方
public static function getDetailService($param)
global $bdd; // bad practice, see later suggestion
$detail = $bdd->prepare('SELECT
spb_services.spb_services__name,
spb_services.spb_services__description,
spb_services.spb_services__banner,
spb_services.spb_services__tabs,
spb_services.spb_services__category
FROM spb_services
WHERE spb_services.spb_services__name LIKE :service');
// $GET? I assume you want to use the `$param you pass as a param to this function
//$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
// a LIKE normally requires a string like '%something%'
// or 'something%'
// DO we assume you passed $param with the wildcards already applied?
$detail->bindValue(':service', $param, PDO::PARAM_STR);
// now the prepared query must be executed
$detail->execute();
// fetchAll returns ALL the result set into an array
$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
// as you are using a LIKE we have to assume there will be more
// than one row returned.
// fetchColumn makes no sense here
//$lignes = $detail->fetchColumn();
// You already did a fetchAll so this makes no sence
//$detail = $detail->fetchAll(PDO::FETCH_ASSOC);
// as all you appear to be doing is testing if one or more rows are returned
// then all you need to do is coumt the occurances in the $resultat array
$retour = (count($resultat) > 0) ? array('status' => 'ok') : array('status' => 'error');
// Now you need to return something
return $retour;
在类方法中使用
global
也是不好的做法,因为它会破坏封装,最好将类似的东西作为参数传递。
EG这个
public static function getDetailService($param)
global $bdd;
变成这样
public static function getDetailService($bdd, $param)
// global $bdd; <-- no longer needed
或者,如果整个班级都需要它,则将其设为班级属性!
如果我是对的,并且您想从这种方法中知道的只是是否存在某些东西,
SELECT COUNT(id) as cnt
将是一种更有效的方法,但让我们再等一天,因为它也会改变您的获取方式结果并编写此代码的其余部分最后注意:在任何可能出错的 PDO 语句之后,您都没有进行错误检查。几乎所有这些 PDO 语句都返回一个状态,如果为 false,您应该向自己显示 PDO 生成的错误消息,请参阅ErrorInfo
【讨论】:
您真的很有帮助,感谢您的所有建议,并感谢大家接受提示来回答我。我必须检查所有答案是否满意,但这个答案是最完整的,并且解决了问题。【参考方案4】:你忘了做 $detail->execute();处理 SQL 请求
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
if( ! $detail->execute())
die('Invalid Mysql Query!');
$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
希望有帮助:)
【讨论】:
派对晚了,伙计以上是关于PDO 准备和执行查询总是返回错误的主要内容,如果未能解决你的问题,请参考以下文章
pdo 中的 errorinfo 函数总是在 medoo lib 中返回 0000
MySQL 全文连字符和大括号返回错误(最初:PDO 准备好的语句没有做它的工作?)