你应该在MySQL请求中引用数字吗?

Joh*_*ith -1 php mysql request

什么是更专业和错误证明方法与简单的mysql而不是PDO或任何东西

我通常喜欢这样

    $sql_request = "SELECT * 
                      FROM myusers 
                          WHERE user_id = {$user_id} 
                            AND email = '{$email_address}' 
                              LIMIT 0,1";
Run Code Online (Sandbox Code Playgroud)

不过我应该引用{$user_id}一下吗?

即使我得到用户输入我也不引用数字,但是在处理之前我会检查ctype_digit().

spe*_*593 6

不,没有必要在数字文字周围加上引号.

使用MySQL,如果数字文字用单引号括起来就没问题; 我认为我们经常看到这样做的原因是程序员不关心它是字符还是数字,而只是在所有文字中加上引号.

引用值时的行为存在差异,而当值不是数字文字时,则不引用.例如,给定一个id类型的列INTEGER,在此上下文中

... WHERE id = '1X'
Run Code Online (Sandbox Code Playgroud)

'1X'这里将被解释为值1字面数值,但在这种情况下

... WHERE id = 1X
Run Code Online (Sandbox Code Playgroud)

1X这里将被解释为一个列名,而不是作为数字文本.这可能会导致MySQL抛出"未知列"异常.

考虑一下如何解释它们的区别......

... WHERE id = 'id'   -- 'id' will be interpreted as numeric literal value 0

... WHERE id = id     -- id will be interpreted as a column name
Run Code Online (Sandbox Code Playgroud)

所以它真正归结为哪种行为最适合您的应用程序,当您期望被解释为数字文字时,不是数字.


我个人的偏好是引用数字文字.这可能是由于我对其他DBMS的经验以及避免隐式数据转换引起的问题的需要.我个人的偏好也是使用预准备语句,并避免我的语句包括SQL文本中的文字值.(对于MySQL而言,这一点大多没有实际意义,因为带有绑定变量的预准备语句在发送到数据库时会转换为纯SQL文本......但这是由MySQL库完成的,而不是我的代码.再次,这是首选是我可能最熟悉的是使用其他RDBMS(Oracle,Teradata,DB2,SQL Server)而不是MySQL本身的长期经验.