PHP-MySQL中SELECT的参数值编码

时间:2009-02-05 18:22:23

标签: php mysql quotes

下面的Alt A是来自php-mysql教程的声明。它应该工作。
我发现id-value相当混淆并且测试了alt B.这也很有效!
alt A的id值有什么意义?

MySQL 5.0.51,PHP 5.2.6

// Alt A :  
$sql = "SELECT * FROM example WHERE id = '".$q."'";  
// Alt B :  
$sql = "SELECT * FROM example WHERE id = $q";  

6 个答案:

答案 0 :(得分:1)

这只是从静态和可变数据构建字符串的两种不同方法。

备选方案A使用连接,或使用连接运算符连接字符串和变量标记。

备选方案B使用变量扩展,其中双引号分隔字符串中的变量在评估时扩展为它们的值。

两者都不一定更好或者更受欢迎,但是如果你必须使用单引号分隔的字符串,那么你需要使用备选A。

当然,这些都不比使用绑定参数构建SQL查询更好,因为不这样做会让您容易受到SQL注入攻击。

答案 1 :(得分:1)

使用“Alt A”中的示例有两个原因。首先,如果字符串用单引号''括起来,变量的名称将用在字符串中而不是它的值中。

$id = 7;
'SELECT * FROM table WHERE id = $id' //works out to: WHERE id = $id
"SELECT * FROM table WHERE id = $id" //works out to: WHERE id = 7

其次,将字符串与函数调用的结果结合起来很有用。

"SELECT * FROM table WHERE id = '".getPrimaryId()."'"

答案 2 :(得分:0)

除了已经说过的内容之外,我发现最好的做法,如果我正在写一个查询,那么就这样写:

$ sql =“SELECT * FROM table WHERE uid =”。 $ uid。 “限制1”;

这样编写SQL的原因是:1。MySQL查询不必解析查询中的PHP变量,2现在您可以轻松读取和管理查询。

答案 3 :(得分:0)

当PHP与MySQL通信时,它实际上(实质上)是两种语言相互通信。这意味着字符串将在被发送到另一个语言之前由第一语言处理。这也意味着根据接收语言来思考

在这种情况下:

$q = 'some_name';<br/>
$query = "SELECT * FROM exempel WHERE id = $q";<br/>

你告诉MySQL到     “SELECT * FROM example1 WHERE id = some_name。

在这种情况下:

$q = 'some_name';<br/>
$query = "SELECT * FROM exempel WHERE id = '$q'";<br/>

和这种情况:

$q = 'some_name';<br/>
$query = "SELECT * FROM exempel WHERE id = '".$q."'";<br/>

你告诉MySQL到     “SELECT * FROM example1 WHERE id ='some_name'。

第一个示例应该导致错误,因为some_name不是MySQL查询的有效部分(在该上下文中)。另一方面,接下来的两个将正常工作,因为MySQL将查找字符串“some_name”。

答案 4 :(得分:0)

你也可以这样做:

$sql="SELECT * FROM exempel WHERE id = {$q}";

这对于引出诸如以下内容非常有用:

$sql="SELECT * FROM exempel WHERE id = {$row[id]}";

答案 5 :(得分:-1)

在'alt B'中,$ q必须是int或float或其他数字

在'alt A'中,$ q可以是字符串,整数等等。

单引号使这成为可能。如果您是第一次看到它,有时很难看到。