繁体   English   中英

PHP Prepared MySQL的声明已经开始添加引号

[英]PHP Prepared MySQL statments have started adding quote marks

所以我一直在使用预处理语句和一些项目,这是一个非常好的干净方式与MySQL数据库进行交互,但今天我遇到了一个奇怪的问题。

我准备好的声明已经开始为sql语句添加额外的'和我的生活我不知道为什么...

所以这是代码:

<?php

    $sortby="ORDER BY submit_date DESC";
    $offset = 3;

    $sql = "SELECT img_id, img_name, submit_date FROM tbl_images WHERE img_active='y' :sortby LIMIT :offset, 9";

    $stmt = $this->_db->prepare($sql);
    $stmt->bindParam(":sortby", $sortby, PDO::PARAM_STR);
    $stmt->bindParam(":offset", $offset, PDO::PARAM_INT);
    $stmt->execute();

?>

所以上面没有返回任何东西,所以查看数据库日志,这就是查询的样子

SELECT img_id, img_name, submit_date FROM tbl_images WHERE img_active='y' 'ORDER BY submit_date DESC' LIMIT 3, 9

它似乎在“ORDER BY submit_date DESC”周围加了一套额外的'',但是还没有绕过偏移?

任何人都可以发现问题,因为它让我疯了:)

先感谢您!

解决方案,感谢发布的那些人,你是对的,我把字段分成了几个部分,就像一个魅力。 以下代码解决方案

<?php

    $sortfield="submit_date";
    $sortway="DESC"
    $offset = 3;

    $sql = "SELECT img_id, img_name, submit_date FROM tbl_images WHERE img_active='y' ORDER BY :sortfield :sortway LIMIT :offset, 9";

    $stmt = $this->_db->prepare($sql);
    $stmt->bindParam(":sortfield", $sortfield, PDO::PARAM_STR);
    $stmt->bindParam(":sortway", $sortway, PDO::PARAM_STR);
    $stmt->bindParam(":offset", $offset, PDO::PARAM_INT);
    $stmt->execute();

?>

看一下mysqli_stmt::prepare的文档:

标记仅在SQL语句中的某些位置是合法的。 例如,允许它们在INSERT语句的VALUES()列表中(指定行的列值),或与WHERE子句中的列进行比较以指定比较值。

基本上,查询的任何结构都不允许是绑定参数。 只能以这种方式发送数据。

PDO准备好的语句以同样的方式工作。 但是,在你的情况下,PDO有点愚蠢,因为它在“模拟准备”模式下运行(这是默认模式,但你应该将其关闭以从PDO中获得最大收益)。 它基本上完成所有替换,而不是分别将查询和数据发送到服务器。 它看到数据是一个字符串,并认为“aha,一个字符串:我需要在此处加上引号。” 因此,您最终会得到格式错误的查询。

解决方案不是使用绑定参数构建查询的结构部分。 要么用串联替换它们,要么(并且这更好)为不同的设置提供替代查询字符串。 这是最安全的方式:涉及连接的任何事情都是不安全因素。

哦,转PDO模拟准备!

对于PDO,您不应在WHERE子句或ON子句之外使用预准备语句绑定变量替换。 如果你这样做 - 任何字符串 - 将被引用(他们应该)。 虽然$ offset整数绑定可能有效,但您不应该这样做。 您应该使用字符串替换该值(将其与有效值的白名单数组进行比较)。

  $sql = "SELECT img_id, img_name, submit_date FROM tbl_images WHERE img_active='y' $sortby LIMIT $offset, 9";

您希望字符串插入$sortby ,而不是将其绑定为转义和引用的SQL文字。

(但请注意不要插入不受信任的SQL片段!)

参数绑定用于将文字值替换为查询,通常我们通常表示普通数字或字符串。 参数不适用于SQL标识符(如表名或列名),也不适用于语法元素。

PDO将$sortby解释为文字字符串,这是你要求它做的:

SELECT ... WHERE image_active='y' 'literal string substituted here' ...

您当然会使用该查询生成语法错误。

令人困惑的是MySQL 确实允许占位符用于LI​​MIT子句的参数。 这非常方便,但熟悉其他RDBMS的人会感到惊讶。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM