我有一个功能,
返回给我的总是一个错误,即使在phpmyadmin中,当我通过查询时也会有结果。
我猜我的查询有问题,但我不知道是什么。我曾经做过我的代码做mysql_real_escape_string,然后我转向PDO,他们告诉我我应该为逃避GET变量做准备,所以我试着去做。
以下是我的查询
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转储返回给我预期的(来自网址)
然后我做了$detail->debugDumpParams();
我在我的localhost phpmyadmin中通过查询,它返回给我的预期但不是在使用PDO时。
我猜小事情是错的,我不知道是什么。
这不会返回任何错误,但总是会出错,就好像没有num_rows_result
总结一下麻烦,GEt会返回预期的结果,但是当我们转到查询时,它没有返回任何结果(除了我的phpmyadmin复制并粘贴查询)
非常感谢Anykind的帮助
编辑:按其他用户的预期完成修改
答案 0 :(得分:2)
需要纠正参数绑定。
在为参数提供值时,您缺少:
。
更正后的代码:
...
WHERE spb_services.spb_services__name LIKE :service');
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
...
答案 1 :(得分:2)
只在代码中发出忘记在获取数据之前执行查询它将是
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
$detail->execute();// execute it first
$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
print_r($resultat);
答案 2 :(得分:2)
您的代码中发生了许多奇怪的事情。
我评论了我认为需要改变的地方
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
答案 3 :(得分:1)
你忘了做$ detail-&gt; execute();处理SQL请求
$detail->bindValue(':service', $_GET[$param], PDO::PARAM_STR);
if( ! $detail->execute()) {
die('Invalid Mysql Query!');
}
$resultat = $detail->fetchAll(PDO::FETCH_ASSOC);
希望有所帮助:)