开发者社区> 问答> 正文

如何在MySQL语句中包含PHP变量

我正在尝试在内容表中插入值。如果我在VALUES内没有PHP变量,则效果很好。当我将变量$type放在里面时,VALUES这是行不通的。我究竟做错了什么?

$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");

展开
收起
保持可爱mmm 2020-05-08 10:47:03 630 0
1 条回答
写回答
取消 提交回答
  • 在任何MySQL语句中添加PHP变量的规则很简单:

    任何表示SQL数据文字的变量(或简单地说-SQL字符串或数字)都必须通过准备好的语句添加。没有例外。 任何其他查询部分(例如SQL关键字,表或字段名或运算符)都必须通过白名单进行过滤。 因此,由于您的示例仅涉及数据文字,因此必须通过占位符(也称为参数)添加所有变量。为此:

    在您的SQL语句中,将所有变量替换为占位符 准备结果查询 将变量绑定到占位符 执行查询 以下是使用所有流行的PHP数据库驱动程序的方法:

    使用mysql_query添加数据文字 这样的驱动程序不存在。

    使用添加数据文字 mysqli $type = 'testing'; $reporter = "John O'Hara"; $query = "INSERT INTO contents (type, reporter, description) VALUES(?, ?, 'whatever')"; $stmt = $mysqli->prepare($query); $stmt->bind_param("ss", $type, $reporter); $stmt->execute(); 代码有点复杂,但是所有这些运算符的详细说明都可以在我的文章“ 如何使用Mysqli运行INSERT查询”中找到,并且可以大大简化该过程。

    使用PDO添加数据文字 $type = 'testing'; $reporter = "John O'Hara"; $query = "INSERT INTO contents (type, reporter, description) VALUES(?, ?, 'whatever')"; $stmt = $pdo->prepare($query); $stmt->execute([$type, $reporter]); 在PDO中,我们可以将绑定和执行部分组合在一起,这非常方便。PDO还支持命名占位符,有些占位符非常方便。

    添加关键字或标识符 但是有时我们添加了一个代表查询的另一部分的变量,例如关键字或标识符(数据库,表或字段名)。在这种情况下,必须对照在脚本中明确编写的值列表检查变量。这在我的另一篇文章《基于用户的选择在ORDER BY子句中添加字段名称》中进行了解释:

    不幸的是,PDO没有标识符(表和字段名)的占位符,因此开发人员必须手动过滤掉它们。这种过滤器通常称为“白名单”(我们只列出允许的值),而不是“黑名单”,其中列出不允许的值。

    因此,我们必须在PHP代码中明确列出所有可能的变体,然后从中进行选择。

    这是一个例子:

    $orderby = $_GET['orderby'] ?: "name"; // set the default value $allowed = ["name","price","qty"]; // the white list of allowed field names $key = array_search($orderby, $allowed, true); // see if we have such a name if ($key === false) { throw new InvalidArgumentException("Invalid field name"); } 方向应使用完全相同的方法,

    $direction = $_GET['direction'] ?: "ASC"; $allowed = ["ASC","DESC"]; $key = array_search($direction, $allowed, true); if ($key === false) { throw new InvalidArgumentException("Invalid ORDER BY direction"); } 这样的代码之后,$direction和$orderby变量都可以安全地放入SQL查询中,因为它们等于允许的变体之一,否则将引发错误。

    关于标识符的最后一件事,还必须根据特定的数据库语法设置它们的格式。对于MySQL,它应该是backtick标识符周围的字符。因此,示例中最终订单的查询字符串为

    $query = "SELECT * FROM table ORDER BY $orderby $direction";来源:stack overflow

    2020-05-08 10:47:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像