V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hard2reg
V2EX  ›  问与答

PDO 语句中引用变量的问题

  •  
  •   hard2reg · 2018-04-07 19:49:57 +08:00 · 1567 次点击
    这是一个创建于 2415 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $stmt = $pdo->prepare("SELECT CONTENT FROM `POSTS` LIMIT ?,6");
    $stmt->bindParam(1, $offset);
    $stmt->debugDumpParams();
    

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

    12 条回复    2018-04-08 18:18:00 +08:00
    hard2reg
        1
    hard2reg  
    OP
       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
        2
    DavidNineRoc  
       2018-04-07 20:23:37 +08:00
    预处理语句不会得到正确的 SQL 的,PDO 是预处理,直接发送给 MySQL 处理
    hard2reg
        3
    hard2reg  
    OP
       2018-04-07 20:25:32 +08:00
    @DavidNineRoc 那就会涉及到注入问题了吧
    1762628386
        4
    1762628386  
       2018-04-07 20:57:05 +08:00
    @hard2reg 不会的 是问号才对呀 不然怎么叫预处理呢
    https://segmentfault.com/q/1010000008671265
    hard2reg
        5
    hard2reg  
    OP
       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
        6
    1762628386  
       2018-04-07 22:14:22 +08:00
    @hard2reg 刚看了下几个框架的源码 都是类似 (int) $limit 拼接的 没有用预处理 貌似很早就这这样了
    DavidNineRoc
        7
    DavidNineRoc  
       2018-04-07 23:18:49 +08:00 via Android   ❤️ 1
    预处理是不会存在注入问题的,因为参数绑定会限制执行参数。
    还有楼上说看了几个框架,说是手动拼接 SQL,这个没错,但是参数还拼接,我不信。除非现在是 2008,现在的框架肯定都是 PDO 驱动数据库层的,既然用了 PDO 肯定会用预处理的。(可能还真有这种框架
    想得到正确的 SQL,自己正则匹配预处理 SQL,然后匹配参数
    akira
        8
    akira  
       2018-04-08 00:26:42 +08:00
    @hard2reg 你在 5 楼说的不行是什么。
    hard2reg
        9
    hard2reg  
    OP
       2018-04-08 01:41:23 +08:00 via iPhone
    @akira 用问号绑定不了……这个好像是硬伤
    akira
        10
    akira  
       2018-04-08 14:57:45 +08:00
    @hard2reg
    1.确认下你的 mysql 版本 是 5.6 或以上
    2. 关闭框架的 pdo 预处理
    carlclone
        11
    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
        12
    hard2reg  
    OP
       2018-04-08 18:18:00 +08:00
    @akira 我的是 PHP7
    @carlclone 还可以这么用?我以后试试。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1155 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:47 · PVG 07:47 · LAX 15:47 · JFK 18:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.