【问题标题】:mysqli, prepared statements, and INSERT-SELECTsmysqli、prepared statements 和 INSERT-SELECTs
【发布时间】:2013-08-25 23:05:46
【问题描述】:

假设我在 InnoDB 数据库中有两个表:categoriesjokes;并且我正在使用 PHP/MySQLi 来完成这项工作。表格如下所示:

CATEGORIES
id (int, primary, auto_inc)  |  category_name (varchar[64])
============================================================
1                               knock, knock

JOKES
id (int, primary, auto_inc)  |  category_id (int)  | joke_text (varchar[255])
=============================================================================
empty

感谢previous 在这里的回答,我发现您可以执行以下操作来添加一个新笑话:$joke_text$category_id

INSERT INTO jokes (category_id, joke_text)
SELECT c.id, '$joke_text'
FROM categories AS c WHERE c.id = $category_id;

这使我能够在不使用外键的情况下确保 $category_id 值指的是现有类别(请忽略外键问题,因为我的问题旨在帮助我学习“复杂的”准备好的语句)。

所以效果很好。但是,我现在正在尝试学习准备好的陈述,在花了一整天的时间之后,我终于掌握了基础知识。不幸的是,我绝对不知道如何在 mysqli 下使用准备好的语句执行上述 SQL 查询,并且我无法在网上找到有关此类问题的任何信息。

如果有人可以帮助我,我将非常感激。

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

    首先,您创建的语句非常像您所做的正常语句

    $stmt = $mysqli->prepare("INSERT INTO jokes (category_id, joke_text)
    SELECT c.id, ?
    FROM categories AS c WHERE c.id = ?;");
    

    获取绑定到参数's'的语句代表字符串数据,i代表整数

    $stmt->bind_param('si', $joke_text,$category_id);   // bind to the parameters
    

    /* 执行准备好的语句 */

    $stmt->execute();
    

    【讨论】:

    • 使用 mysqli real_escape_string 函数转义 POST 数据是否违背了使用准备好的语句的目的?您使用准备好的语句来跳过该步骤。否则,它就像调用 addlashes 函数,然后使用 real_escape_string 函数转义它。或者这至少是我在迁移到 PDO 之前第一次使用 MySQLi 时所读到的。见http://stackoverflow.com/questions/6232084/is-mysql-real-escape-string-necessary-when-using-prepared-statements
    • 我同意,这只是一种习惯 :) 可以安全移除
    • 双重转义可能最终会在发送一个单引号时给您两个单引号。这就是我看到安全问题的地方。我们最好建议改掉这个习惯。 :)
    • 嗯,也许这看起来比实际上要复杂得多。但是,我不是也想为WHERE c.id = $category_id 声明添加? 吗?所以它会是:WHERE c.id = ?,然后我只需在stmt->bind_param 上添加$category_id 作为第二个参数?
    • 没必要,你只想从外部源添加参数,这是从数据库获取数据
    【解决方案2】:

    我实际上是在写一些代码,但我意识到你也在网上搜索这个。因此,我为您提供了 PHP 网站的链接,您可以在其中看到其中的许多内容。

    Prepared statements

    mysqli in general

    既然您正在学习 MySQLi,为什么不直接转向 PDO。它非常相似,但我认为这就是未来的发展方向。

    http://php.net/manual/en/book.pdo.php

    http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

    【讨论】:

      猜你喜欢
      • 2017-05-07
      • 1970-01-01
      • 2016-02-19
      • 2011-11-28
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多