我在哪里需要在我的MYSQL查询中使用反引号或引号?

I am trying to run the following query, but I am not sure if my 's should be `s or not, $form_id = the record's column , $user_id is the primary key of the record called cf_id .

$querydate is going to be echo'd later on in the script, as it pulls the date from the record that equals to $form_id and $user_id .

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

EDIT >>>>>>

After trying some of the solutions below, it seems to work ok, but instead of getting the date stored under the form name, I am getting this echo'd instead, so im not sure whats happening now : :Resource id #120 :Resource id #121 :Resource id #122 :Resource id #123

The table is setup like the followng:

[USER_ID] [FORM_ID1212212]  [FORM_ID1212112]  
 [1]      [2-1-2012]        [2-1-2012]       
 [2]      [1-1-2012]        [1-1-2012]       
dpgf42422
dpgf42422 re:编辑...你正在使用的教程应该展示如何使用mysql_fetch_row()从$querydate结果集中获取每个结果
8 年多之前 回复
drl959975
drl959975 可能重复的反引号和单引号有什么区别?我可以在上面的查询中使用IF语句吗?-并且-使用字段名称周围的反引号
8 年多之前 回复
dtj2ww9500
dtj2ww9500 你不应该像这样执行MySQL查询;使用预备语句代替。
8 年多之前 回复

3个回答



对表名和列名使用反引号(`),对字符串使用单引号(')。</ p>

  $ querydate = mysql_query(“SELECT$ form_id FROM email_history WHERE cf_id ='$ user_id'”);

</ code> </ pre>

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

但也考虑切换到PDO并使用预处理语句,或者至少使用mysqli而不是mysql </ p>
</ div>

展开原文

原文

You use backticks (`) for table and column names, single quotes (') for strings.

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

Backticks are only needed when your table name or column name is a MySQL reserved word... best practise is to avoid reserved words

But also consider switching to PDO and using prepared statements, or at least to mysqli rather than mysql

douqie6454
douqie6454 FWIW,如果您的标识符包含空格,特殊/国际字符或重要案例,您还应该使用分隔标识符。 看我的回答Do do different databases使用不同的名字引用?
8 年多之前 回复
duanpengya7074
duanpengya7074 我已经更新了上面的问题,因为我不确定我是否解释正确,我可能在错误的地方使用了错误的数组名称,可能为什么我回错了:-S
8 年多之前 回复
douliang4858
douliang4858 我完全同意 - PDO是要走的路。 我只是指出,出于OP的目的,他应该知道绑定不适用于列名,这是他所询问的反对的具体情况。
8 年多之前 回复
dongteng0748
dongteng0748 - 对你有好处,一旦你完成了那些oldskool教程,SO就是一个很好的帮助来源,这里的人们将会感谢你努力学习如何在你超越基础知识后使用更好的方法做事...虽然学习了 如果您能找到更好的教程,首先错误的方法并不总是最好的学习方法
8 年多之前 回复
dongyun7571
dongyun7571 请帮个忙,忽略任何不使用PDO的PHP DB教程。 它几乎同样易于使用。
8 年多之前 回复
doutang6600
doutang6600 <sigh />确实,网络问题在于所有那些过时的教程仍然可以永久使用,但我仍然会在被问到时尝试推荐更好的做法。
8 年多之前 回复
dtf54486
dtf54486 我只是想学习基础知识,因为大多数示例片段似乎都是在反对pdo的oldskool mysql查询中,一旦我学会了基础知识,我将进入pdo :-)
8 年多之前 回复
dongzu0742
dongzu0742 事实上,但似乎在OP的情况下,船已经航行......
8 年多之前 回复
dqyat62284
dqyat62284 没错,你不能绑定表/列名; 但是你需要一个定义良好的数据模型......这并不意味着你仍然不能在字符串中使用$变量...我只是推荐一般的最佳实践而不是 继续使用mysql扩展,而可怕的“或死”也应该归于历史
8 年多之前 回复
dongmi1864
dongmi1864 FWIW,您不能使用预准备语句绑定表名或列名。
8 年多之前 回复



最佳做法是:</ p>

 “SELECT$ form_id FROMsemail_historyWHEREcf_id ='$ user_id'“
</ code> </ pre>

应该在字段名称和表名称(以及数据库名称)周围使用反引号,并且应该使用引号 值。</ p>
</ div>

展开原文

原文

Best practice would be:

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

Backticks should be used around field names and table names (and DB names), and quotes should be used around values.

doufengsui7449
doufengsui7449 :)我同意这个......这是“最佳实践”,假设你只是“手动”编写一个mysql查询
8 年多之前 回复
douju5933
douju5933 鉴于PDO的存在,很难同意这是“最佳实践”......
8 年多之前 回复

You should:

  1. ensure that $form_id is a legal table name, especially if it's generated from user-supplied input.

  2. use a bound parameter for $user_id

e.g.:

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

Back-ticks are appropriate for all table and column names. Unfortunately you can't use variable column names in a parameterised query, so you do need to construct that part of the query by hand.

dpgui8229808
dpgui8229808 不,结果将在$ row [0]中。
8 年多之前 回复
dsaxw4201
dsaxw4201 你会回应'$ res'; 从该查询中获取信息?
8 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐