Я не вижу никакой разницы, используя одиночные кавычки или двойные кавычки. Когда или почему я должен использовать первую, а не последнюю?
Я читал некоторые, где для SQL я должен использовать синглы – почему?
Вы должны использовать комбинацию одинарных кавычек и mysql_real_escape_string или перейти в PDO .
Mysql_real_escape_string позаботится о том, чтобы очистить любую нечистую переменную, которую вы хотите сохранить в своей базе данных, и одинарные кавычки предотвратят любое выполнение внутри нее.
Вот пример:
$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 Injection.
Например, обычный запрос
SELECT * FROM users WHERE user = 'test'
инъецированный запрос:
SELECT * FROM users WHERE user = 'anything' OR 'x'='x'
другой пример:
SELECT * FROM users WHERE user = ' '; DROP TABLE users
Подробнее о SQL-инъекции : SQL-инъекция , MySQL Injection
Почему вы должны использовать PDO php для доступа к базе данных
Используйте то, что проще или удобнее. Если они вам все равно, то одинарная цитата более переносима, по крайней мере, теория.
Если запрос генерируется, например, PHP, то одинарные кавычки более удобны для записи SQL-запросов, поскольку двойные кавычки позволяют выражению PHP заменять переменные.
$query = "SELECT * FROM $sometable WHERE somefield = '1'";
Согласно правилам PHP, одинарные кавычки (если бы они были использованы) предотвращали расширение $sometable
.
Что касается теоретической переносимости, я использовал Oracle, MySQL, MS Sql server, SQL Lite и некоторые домашние ароматы и никогда не испытывал проблем с кавычками.
Если ваш сервер MySQL работает с флагом --ansi
, тогда "
двойные "
кавычки перестанут работать. Строки SQL должны быть заключены в '
одиночные '
кавычки.
Или, более конкретно, двойные кавычки фактически ведут себя как backticks. Они могут использоваться для имен столбцов:
SELECT "colum&name", `x&y` FROM "fictional-query" WHERE strcolumn = 'text' OR "column&name" = 'string'
То же самое, однако, не получится, если mysqld не будет работать в режиме, совместимом с ansi. Только тогда двойные кавычки эквивалентны одиночным кавычкам для строк. Вот почему их следует избегать.
Строки, заключенные в двойные кавычки, наиболее часто используются в PHP-скриптах, потому что они обеспечивают максимальную гибкость. Это связано с тем, что и переменные, и escape-последовательности будут проанализированы соответственно.
Закрытие строки в одинарных кавычках полезно, когда строка должна интерпретироваться точно так, как указано. Это означает, что как переменные, так и escape-последовательности не будут интерпретироваться при анализе строки.
Двойные кавычки пригождаются, когда у вас есть одинарные кавычки в синтаксисе mysql
$query = "SELECT * FROM tableName WHERE columnName = '{$value}'";
Одиночные кавычки более строгие в PHP. Например, одинарные кавычки не позволят заменить переменные внутри строки.
$myval = "world"; echo "Hello $myval"; // produces "Hello world" echo 'Hello $myval'; // produces "Hello $myval"
Кроме того, вы считаете, что, поскольку одинарные кавычки более строгие, они будут более эффективными, но это не так. Эффективность работы с строкой PHP – это смешная (и документированная) вещь, как здесь видно .