【问题标题】:Where do I need to use backticks or quotes in my MYSQL query?在我的 MYSQL 查询中,我需要在哪里使用反引号或引号?
【发布时间】:2012-02-01 00:56:42
【问题描述】:

我正在尝试运行以下查询,但我不确定我的 's 是否应该是 `s,$form_id = 记录的列,$user_id 是名为 cf_id 的记录的主键。

$querydate 稍后将在脚本中回显,因为它从等于 $form_id 和 $user_id 的记录中提取日期。

$querydate = mysql_query("SELECT '$form_id' FROM email_history WHERE cf_id = '$user_id'") or die(mysql_error());

编辑>>>>>>

在尝试了下面的一些解决方案之后,它似乎工作正常,但是我没有得到存储在表单名称下的日期,而是得到了这个回显,所以我不确定现在发生了什么: :资源 ID #120 :资源 ID #121 :资源 ID #122 :资源 ID #123

表格设置如下:

[USER_ID] [FORM_ID1212212]  [FORM_ID1212112]  
 [1]      [2-1-2012]        [2-1-2012]       
 [2]      [1-1-2012]        [1-1-2012]       

【问题讨论】:

标签: php mysql


【解决方案1】:

你应该:

  1. 确保$form_id 是合法的表名,尤其是如果它是从用户提供的输入生成的。

  2. $user_id使用绑定参数

例如:

$sql = "SELECT `$userid` FROM `email_history` WHERE `cf_id` = ?"
$res = $db->query($sql, array($user_id));
while ($row = $res->fetchRow()) {
   ...
}

反引号适用于所有表名和列名。不幸的是,您不能在参数化查询中使用可变列名,因此您需要手动构建查询的这一部分。

【讨论】:

  • 你会回显'$res'吗?从该查询中取回信息?
  • @IainSimpson 不,结果将在$row[0]
【解决方案2】:

您使用反引号 (`) 表示表名和列名,使用单引号 (') 表示字符串。

$querydate = mysql_query("SELECT `$form_id` FROM email_history WHERE cf_id = '$user_id'"); 

仅当您的表名或列名是 MySQL 保留字时才需要反引号...最佳做法是避免保留字

但也可以考虑切换到 PDO 并使用准备好的语句,或者至少切换到 mysqli 而不是 mysql

【讨论】:

  • FWIW,您不能将表名或列名与准备好的语句绑定。
  • 没错,你不能绑定表/列名;但是对于定义明确的数据模型,您不需要...这并不意味着您仍然不能在字符串中使用 $variables ...我只是推荐一般的最佳实践,而不是继续使用mysql扩展,可怕的“或死”也该载入史册
  • 我现在只是想学习基础知识,因为大多数示例的 sn-ps 似乎都在 oldskool mysql 查询中与 pdo 相对,一旦我学习了基础知识,我就会进入 pdo :- )
  • @Alnitak 的确,网络的问题是所有那些过时的教程仍然可以永久使用,但我仍然会尝试推荐更好的做法问。
  • @IainSimpson 请帮自己一个忙,忽略任何不使用 PDO 的 PHP DB 教程。它实际上几乎同样易于使用。
【解决方案3】:

最佳做法是:

"SELECT `$form_id` FROM `email_history` WHERE `cf_id` = '$user_id'"

应该在字段名和表名(和数据库名称)周围使用反引号,并且应该在值周围使用引号。

【讨论】:

  • :) 我同意这一点...这是“最佳实践”,假设您只是“手动”编写 mysql 查询
猜你喜欢
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 2017-12-07
相关资源
最近更新 更多