【问题标题】:PDO ->prepare on mysql query won't workPDO - >准备mysql查询将不起作用
【发布时间】:2013-06-15 05:55:12
【问题描述】:

我有一个 mysql 查询,我想像这样总结:$sql = $dbh->prepare("SELECT * FROM log"); 然后,我像这样执行它:$sql->execute();,现在我的问题是为什么我不能将它用于:@ 987654323@循环?当我试图让它进入 foreach 循环时,登录表单不再从数据库中读取。如果我删除 dbh->prepare 语句,它工作得很好,但我想阻止 SQL 注入。谢谢。

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    你需要先fetch结果(执行语句后):

    $rows = $sql->fetchAll();
    foreach($rows as $row){
      ...
    }
    


    query() 只需要字符串(SQL 查询)。但是您将prepare() 的返回结果传递给它,这是一个PDOStatement 对象。

    prepare()execute() 连续使用,而不是query()。当您有要传递给 execute() 的输入参数时,准备语句是有意义的。

    简而言之:

    $stm = $dbh->prepare('SELECT...');
    $stm->execute();
    

    相当于:

    $stm = $dbh->query('SELECT...');
    

    如果您没有要发送的输入参数。

    【讨论】:

    • 非常感谢(投票),所以当使用“准备”时,我必须在循环之前获取?
    • 其实没有。似乎PDOStatement 是可遍历的。也许您的查询有问题?如果你先fetch 可以吗?
    • 好吧,我在“准备”语句之前的方式是这样的: 1. $sql = "SELECT * FROM log"; 2. foreach($dbh->query($sql) as $row) {//somecode};它工作得很好。然后只需添加 $sql = $dbh->prepare("mySQL code");它停止工作了。
    • 已编辑,现在应该有意义了
    【解决方案2】:

    您正在使用准备好的语句$db->prepare($my_sql_query)。当您使用准备好的语句时,您通常可能会将一些变量绑定到查询。例如

    $my_query = 'SELECT * FROM users WHERE user_id=:user_id'
    $prepared_statement = $db->prepare($my_query);
    $prepared_statement->bindValue(':user_id', 123);
    

    现在,当您绑定了值后,您需要执行查询

    $prepared_statement->execude();
    

    当您执行准备好的语句时,它会生成实际的 sql 代码,然后在 mysql 中执行它。然后检索您将执行的结果

    $record = $prepared_statement->fetch(); //if you want to get only one record from the table
    $records = $prepared_statement->fetchAll(); // if you want to get multiple records from the table
    
    foreach($records as $row) {
        // your code here...
    }
    

    如果您使用$db->query(),您应该能够使用以下代码获得结果:

    $sql = 'SELECT name, color, calories FROM fruit ORDER BY name';
    foreach ($db->query($sql) as $row) {
        print $row['name'] . "\t";
        print $row['color'] . "\t";
        print $row['calories'] . "\n";
    }
    
    // outputs 
    // apple   red     150
    // banana  yellow  250
    // kiwi    brown   75
    // lemon   yellow  25
    // orange  orange  300
    // pear    green   150
    // watermelon      pink    90
    

    (取自php.net

    queryprepare 方法有很大区别:

    1. query方法会直接执行你输入的sql代码
    2. prepare 将“准备”您的 sql 代码。此过程将 sql 代码中的所有参数替换为一些实际值(即SELECT * FROM users WHERE user_id=:user_id 将变为SELECT * FROM users WHERE user_id=1)。因此,当您使用准备好的语句时,您需要执行 execute 以便将代码发送到 mysql。

    【讨论】:

    • 您好 tftd,感谢您的回答。是的,我这样做了,但我担心仅仅让 MySQL 查询不被包装会比通过 PDO::"prepare" 语句传递它来避免潜在的 MySQL 注入攻击更不安全。
    • 是的,在所有情况下都使用准备好的语句更好。它们可以防止 sql 注入,是一种很好的做法。
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2013-08-18
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多