加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PDO和PHP / MySQL:PDO编写的语句有什么问题?

发布时间:2020-12-13 17:20:25 所属栏目:PHP教程 来源:网络整理
导读:我知道这个标题听起来很荒谬,但我已经做了几个小时的研究,现在却发现PDO最终没有明显的解决方案……我致力于为一个开放.我也愿意接受我的代码存在缺陷. 使用PHP 5.2 / Ubuntu,此代码可以工作(不使用预处理语句/打开注入): $sql ="SELECT COUNT(*) FROM prop
我知道这个标题听起来很荒谬,但我已经做了几个小时的研究,现在却发现PDO最终没有明显的解决方案……我致力于为一个开放.我也愿意接受我的代码存在缺陷.

使用PHP 5.2 / Ubuntu,此代码可以工作(不使用预处理语句/打开注入):

$sql ="SELECT COUNT(*) FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
    IN (
        SELECT av.attribute_value_id
        FROM attribute_value av
        INNER JOIN attribute a ON av.attribute_id = a.attribute_id
        WHERE a.name LIKE '$attributes'
        AND av.value LIKE '$values'
    ) 
ORDER BY p.price ASC";
$params = array();
$rHowManyPages = Listings::HowManyPages($sql,$params);

但是,使用PDO精心准备的声明:

$sql ='SELECT COUNT(*) FROM property p
INNER JOIN property_attribute pa ON p.property_id = pa.property_id
INNER JOIN property_area pc ON p.property_id = pc.property_id
WHERE pa.attribute_value_id
    IN (
        SELECT av.attribute_value_id
        FROM attribute_value av
        INNER JOIN attribute a ON av.attribute_id = a.attribute_id
        WHERE a.name LIKE :attributes
        AND av.value LIKE :values
    ) 
ORDER BY p.price ASC';
$params = array(':attributes' => $attributes,':values' => $values);
$rHowManyPages = Listings::HowManyPages($sql,$params);

它有效,有点.这是Spartanic疯狂部分:传递相同数据的5个刷新中的1个,PDO给出了这个错误:

TEXT: SQLSTATE[HY093]: Invalid parameter number

这是随机的!怎么样和为什么?

解决方法

是否有可能为命名参数提供的值之一包含问号?我遇到了一个问题,但那是很久以前的事了. (我当然希望他们现在可以解决这个问题.)

在我有限的经验中,PDO对“命名参数”的支持有些粗略.

首先,您不能在语句的多个位置使用相同的命名参数,每个命名参数的占位符名称必须是唯一的,并且只能使用一次.这就是命名论证的一大好处.

我认为我在问号中遇到的问题是一个值,并且无法多次引用一个命名参数(我还没有证实这一点)是由于PDO“命名参数”支持是一个螺栓固定的事后想法支持位置论证;实际上,看起来“命名参数”正在被转化为位置参数.

当命名参数包含下划线字符时,我也遇到了一些困难.

我的解决方法是(ACCCKKK!)使用位置参数而不是命名参数.

(尽管我不喜欢使用位置参数,但它对我有用.)

(我在您显示的代码中没有看到任何错误会导致观察到的行为.显然,还有其他代码没有显示.)

此外,您可能想验证$params数组是否只包含两个元素;当我的数组有一个“额外”不匹配的元素时,我有相同的错误消息.然后,在我的代码中,我退回到使用标量,并分别绑定每个,而不是让PDO捣乱它. (对我来说不是问题,这是我在Perl DBI中过于熟悉的模式.我没有调试问题,而是解决了这些问题.)

注意:通过位置参数,我的意思是使用问号代替名称:

$sql = " ...
  WHERE a.name LIKE ?
    AND av.value LIKE ?
 ... ";

$sth->bindParam(1,$attributes);
$sth->bindParam(2,$values);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读