Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP和mySQL是单引号还是双引号?_Php_Mysql_Sql - Fatal编程技术网

PHP和mySQL是单引号还是双引号?

PHP和mySQL是单引号还是双引号?,php,mysql,sql,Php,Mysql,Sql,我看不出使用单引号或双引号有什么区别。何时或为什么我应该使用第一个而不是后一个 我读过一些关于SQL的文章,我应该使用singles-为什么?使用更简单或更方便的方法。如果它们对你来说都是一样的,那么单引号至少在理论上更便于携带 如果查询是从例如PHP生成的,那么单引号更便于编写SQL查询,因为双引号允许PHP表达式替换变量 $query = "SELECT * FROM $sometable WHERE somefield = '1'"; 根据PHP规则,单引号(如果使用过)会阻止扩展$so

我看不出使用单引号或双引号有什么区别。何时或为什么我应该使用第一个而不是后一个


我读过一些关于SQL的文章,我应该使用singles-为什么?

使用更简单或更方便的方法。如果它们对你来说都是一样的,那么单引号至少在理论上更便于携带

如果查询是从例如PHP生成的,那么单引号更便于编写SQL查询,因为双引号允许PHP表达式替换变量

$query = "SELECT * FROM $sometable WHERE somefield = '1'";
根据PHP规则,单引号(如果使用过)会阻止扩展
$sometable


至于理论上的可移植性,我使用过Oracle、MySQL、MS Sql server、Sql Lite和一些自主开发的风格,并且从来没有遇到过任何引号字符的问题。

您应该使用单引号和或移动到的组合

mysql_real_escape_字符串将负责清除您希望存储在数据库中的任何不干净变量,单引号将阻止其中的任何执行

以下是一个例子:

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));
PDO的例子:

$dbh = new PDO('mysql:dbname=your_database;host=your_host', $user, $password);
$stmt = $dbh->prepare('SELECT * FROM users WHERE user = :username AND password = :password');
$stmt->execute(array('username' => $user, 'password' => $password)); 
如果您没有正确地清理要存储的数据,您可能会遭受SQL注入的影响

例如,普通查询

SELECT * FROM users WHERE user = 'test'
注入查询:

SELECT * FROM users WHERE user = 'anything' OR 'x'='x'
另一个例子:

SELECT * FROM users WHERE user = ' '; DROP TABLE users


单引号在PHP中的限制性更强。例如,单引号不允许在字符串内部替换变量

$myval = "world";
echo "Hello $myval";   // produces "Hello world"
echo 'Hello $myval';   // produces "Hello $myval"

此外,你可能会认为,由于单引号更严格,它们也会更有效,但事实并非如此。PHP字符串操作性能是一件有趣的事情(并且有文档记录)

用双引号括起来的字符串是PHP脚本中最常用的字符串,因为它们提供了最大的灵活性。这是因为变量和转义序列都将被相应地解析

当字符串应完全按照所述进行解释时,将字符串括在单引号内非常有用。这意味着在解析字符串时,变量和转义序列都不会被解释

在mysql语法中使用单引号时,双引号非常方便

$query = "SELECT * FROM tableName WHERE columnName = '{$value}'";

如果您的MySQL服务器使用
--ansi
标志运行,则
引号将停止工作。SQL字符串必须包含在
'
'
引号中

或者更具体地说,双引号实际上表现为反勾号。它们可用于列名:

SELECT "colum&name", `x&y` FROM "fictional-query"
 WHERE strcolumn = 'text' OR "column&name" = 'string'

但是,如果mysqld没有在符合ansi标准的模式下运行,同样的操作也会失败。只有这样,双引号才相当于字符串的单引号。这就是为什么应该避免使用它们。

非常确定SQL中的ANSI标准是单引号。正在查找@Phil Brown:ANSI-92的可引用副本,该副本支持对对象名称使用双引号-大多数数据库支持双引号来指定非标准字符。@OMGPonies啊,我假设OP是指字符串文字only@Phil棕色/@OMG小马,我很确定他指的是字符串文字,因为对象名的单引号会导致字符串文字。这完全不是一个类似的效果。这是从一本书中摘取的,我想这可能会有帮助。PHP与SQL有什么关系?除了标题中的PHP之外,我还假设您是用PHP编写查询的。我将补充我的答案…忘记整套
mysql_*
函数,转到PDO。@Phil yes PDO也是另一种安全的方式。此外,PHP的mysql扩展阻止了多个查询执行,因此“Bobby表”用例通常不会apply@Phil这不是一个特殊的例子,而是SQL注入功能的更一般化的例子。此外,我还添加了3个链接,这些链接不仅显示了php.net中的链接,还进一步解释了它是直接来自php.net的链接。还在顶部添加了一个关于PDO的链接;)