为什么有些变量需要引号而不需要引号

问题描述:

为什么有些变量需要引号而其他变量不需要引号?当我连接到数据库变量时不需要引号,但当我选择或插入数据库时​​,需要引号。为什么有些变量需要引号而不需要引号

例子:

//variables 
    $username="username"; 
    $password="password"; 
    $first=$_POST['first']; 
    $last=$_POST['last']; 

//connect to DB 
    mysql_connect(localhost,$username,$password); 
    @mysql_select_db($database) or die("Unable to connect to database"); 

//values assigned 
    $query = "INSERT INTO guestbook VALUES   
    ('','$first','$last','$email','$web','$comment')"; 
    mysql_query($query); 
+3

能不能请你清理你的问题就不是很清楚了。还有你的例子不是很清楚为好。 – sean

+0

当我连接到我的数据库我盯着周围使用引号$ username。当我插入$ first等值时,我需要加引号你做了一些需要引号和其他的不需要的引号? –

+2

这不是执行数据库查询的安全方法。一旦你掌握了关于SQL注入的基础知识,以及准备/绑定方法,你可以使用mysqli或PDO在PHP中完成。 – FoolishSeth

这是一个字符串文字:"username"。这是一个
这是一个变量$username。它可以容纳任何。把它想象成一个占位符。
这是一个变量里面的字符串文字:"foo $username bar"。它会创建一个新的

创建SQL查询时,只需将一个字符串传递给数据库,然后根据SQL语法规则将其解析。 SQL语法要求您将引号放在特定的部分。它与PHP变量无关。

此外,这是一个常数:localhost。您没有定义该名称的常量,它实际上是PHP通过动态创建字符串'localhost'而恢复的错误。但它实际上是一个错误。

阅读这些PHP语法的各个部分:http://www.php.net/manual/en/langref.php


你只如果要创建一个新的字符串,例如:"foo"需要报价。变量从不需要引号。您可以在字符串文字中使用变量,因此其值将被内插:"foo $bar baz"。但"$foo"总是不必要的,因为它只是创建一个新的字符串,其唯一的内容就是变量的内容。

我想你混淆PHP变量:

$username = "bobby tables"; 

string interpolation

$interp = "foo $username bar"; 

前者字符串"bobby tables"分配给变量$username,后者分配字符串"foo bobby tables bar"到变量$interp

+1

另请参阅:PHP [变量解析](http://us3.php.net/manual/en/language.types.string.php#language.types.string.parsing)。 '“一个”。 $ 2''与''一个$ 2“''''一个{$ 2}”''。 –

+0

好吧,我会看看这个,这看起来也可能很棘手。谢谢 –

PHP将某些字符序列解释为未定义的常量,并将它们视为字符串。

$ php -r 'var_dump(OH_YEAH);' 
PHP Notice: Use of undefined constant OH_YEAH - assumed 'OH_YEAH' in Command line code on line 1 
string(6) "OH_YEAH" 

所以localhost在调用mysql_connect()被解析为一个常数,评估就像"localhost"会。

查询中的变量(一个字符串变量)需要引号使它们作为变量可读。如果不添加引号,则将插入变量的名称而不是变量值本身。
当您连接到数据库时,您不必这样做的原因很简单,因为您在那里不使用字符串变量。

+0

谢谢,这样做更有意义 –

+0

Wut?你的意思是你需要''('$ first')“'中的''来”使变量可读“吗?如果你真的认为*那*,那完全是无稽之谈。 – deceze

为变量的内容插入到数据库中正确的代码是这样的:

//variables 
$username="username"; 
$password="password"; 
$first=$_POST['first']; 
$last=$_POST['last']; 

    //connect to DB 
mysql_connect(localhost,$username,$password); 
@mysql_select_db($database) or die("Unable to connect to database"); 

    //values assigned 
$query = "INSERT INTO guestbook VALUES   
('','.$first.','.$last.','.$email.','.$web.','.$comment.')"; 
mysql_query($query); 

你混淆了PHP和MySQL。对于PHP,你不需要引用变量。

mysql_connect('localhost',$username,$password); 

如果我理解正确你获得的困惑:

$query = "INSERT INTO guestbook VALUES ('','$first','$last','$email','$web','$comment')"; 

你需要围绕这些变量引号是因为它是MySQL的语法,而不是PHP的原因。如果你这样做在MySQL中,你会得到一个错误:

"INSERT INTO guestbook VALUES ('',$first,$last,$email,$web,$comment)"; 

的原因是因为PHP变量转换为它是MySQL的价值,和MySQL将读取这些值读取留言以同样的方式,导致错误。

而且,当我开始,我花了一段时间来掌握PHP引号的区别: “可以有内像这样的PHP变量:

$name = "Eric"; 
echo "this is $name"; // prints this is Eric 

但如果你使用“,而不是”你”会得到:这是$ name '是一个字符串文字。如果你用',实际上想要的变量,你需要逃避它,像这样:

echo 'this is \$name'; 

可见反之亦然为“如果你想让它打印出$名称来代替埃里克,你这样做:

echo "this is \$name"; 

希望这澄清,并不断学习PHP!

+0

''这是\ $ name''→这是\ $的名称 – deceze