【问题标题】:php - single quotes around variables in mysql queriesphp - mysql 查询中变量的单引号
【发布时间】:2014-12-14 20:04:48
【问题描述】:

为什么我在几个通过 php 查询 mysql 的例子中看到了语法:

$q = "CREATE TABLE '$tablename' ('$t_id_name')";

或类似的东西?我问的是变量名周围的单引号。这在 MySQL 字符串中是必需的吗?如果我回显字符串,无论引号是否存在,它似乎都会扩展变量。

如果这样做是为了一个整数,这会造成问题吗?

【问题讨论】:

  • 停止将它们视为变量名,仅仅因为您在代码中使用了变量;这是您正在构建的 MySQL 语句。在 MySQL 中使用反引号 (`),而不是单引号 (') 来包装表和列名(尽管只有当它们是 MySQL 保留字、混合大小写或使用非字母数字字符时才需要它们)

标签: php mysql syntax quotes


【解决方案1】:

字段或表名必须使用反引号 (`),尤其是当字段或表名与 mysql 命令相同时。并且您需要使用单引号 (') 来表示值。

【讨论】:

    【解决方案2】:

    要回答您的问题,引号是必要的,但不是为了扩展变量。典型的 SQL 查询如下所示:

    $q = "SELECT * FROM `table` WHERE `first_name` = 'user3475234'";
    

    现在,考虑以下示例:

    <?php
    $tablename = "users";
    $user = "user3475234";
    
    $q = "SELECT * FROM `$tablename` WHERE `first_name` = '$user'";
    
    echo $q;
    

    这将显示:SELECT * FROM `users` WHERE `first_name` = 'user3475234'。请注意,引号不是输出字符串所必需的,但它们是查询的必要部分。

    话虽如此,这样的代码会打开您的脚本以进行 SQL 注入。我不会对此进行过多解释,因为有很多资源在讨论它,但请考虑某人的用户名是 user3475234' OR 1==1-- 的示例。此用户名将有效地返回表中的所有用户。

    【讨论】:

    • 我很好奇您是否有意分别输入了 ` 和 '?是否优先使用一个而不是另一个,或者它们都应该只是普通的单引号?另外,我现在使用 mysqli_real_escape_string 来避免随之而来的 SQL 注入(但我认为它不会检查 ` 字符)。
    • 反引号用于表名和列名,只有在表或列名是 MySQL 保留关键字时才需要。另一方面,值用引号括起来。
    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多