PDO 语句中引用变量的问题

2018-04-07 19:49:57 +08:00
 hard2reg
$stmt = $pdo->prepare("SELECT CONTENT FROM `POSTS` LIMIT ?,6");
$stmt->bindParam(1, $offset);
$stmt->debugDumpParams();

打印查询语句发现并没有引用上去,仍然是问号。改成:offset 结果也一样。。。。

1504 次点击
所在节点    问与答
12 条回复
hard2reg
2018-04-07 20:04:53 +08:00
```php
$stmt = $pdo->prepare("SELECT CONTENT FROM `POSTS` LIMIT :offset, 6");
$stmt->bindValue(":offset", intval($offset), PDO::PARAM_INT);
```
这样也不行
DavidNineRoc
2018-04-07 20:23:37 +08:00
预处理语句不会得到正确的 SQL 的,PDO 是预处理,直接发送给 MySQL 处理
hard2reg
2018-04-07 20:25:32 +08:00
@DavidNineRoc 那就会涉及到注入问题了吧
1762628386
2018-04-07 20:57:05 +08:00
@hard2reg 不会的 是问号才对呀 不然怎么叫预处理呢
https://segmentfault.com/q/1010000008671265
hard2reg
2018-04-07 21:05:51 +08:00
@1762628386 不行,我查过了,limit 是怎么搞都不行。只能硬核的直接塞 SQL 语句。如下

$sql = "SELECT CONTENT FROM `POSTS` LIMIT " . $_GET["offset"] . ", 6";
$query = $pdo->query($sql);
1762628386
2018-04-07 22:14:22 +08:00
@hard2reg 刚看了下几个框架的源码 都是类似 (int) $limit 拼接的 没有用预处理 貌似很早就这这样了
DavidNineRoc
2018-04-07 23:18:49 +08:00
预处理是不会存在注入问题的,因为参数绑定会限制执行参数。
还有楼上说看了几个框架,说是手动拼接 SQL,这个没错,但是参数还拼接,我不信。除非现在是 2008,现在的框架肯定都是 PDO 驱动数据库层的,既然用了 PDO 肯定会用预处理的。(可能还真有这种框架
想得到正确的 SQL,自己正则匹配预处理 SQL,然后匹配参数
akira
2018-04-08 00:26:42 +08:00
@hard2reg 你在 5 楼说的不行是什么。
hard2reg
2018-04-08 01:41:23 +08:00
@akira 用问号绑定不了……这个好像是硬伤
akira
2018-04-08 14:57:45 +08:00
@hard2reg
1.确认下你的 mysql 版本 是 5.6 或以上
2. 关闭框架的 pdo 预处理
carlclone
2018-04-08 15:32:34 +08:00
$query = $this->_db->prepare("select count(*) from `art` where `id`= ? ");
$query->execute( $artid );
$ret = $query->fetchAll();
hard2reg
2018-04-08 18:18:00 +08:00
@akira 我的是 PHP7
@carlclone 还可以这么用?我以后试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444897

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX