Кодирование параметра-значения для SELECT в PHP-MySQL - PullRequest
1 голос
/ 05 февраля 2009

Alt A ниже - инструкция из учебника php-mysql. Работает как надо.
Я нашел значение id довольно запутанным и протестировал alt B. Это также сработало!
Какой смысл с id-значением alt A?

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 ]

1 голос
/ 05 февраля 2009

Есть две причины использовать пример в «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()."'"
1 голос
/ 05 февраля 2009

Это всего лишь два разных подхода к построению строки из статических и переменных данных.

Альтернатива A использует конкатенацию или объединение строковых и переменных токенов с помощью оператора конкатенации.

Альтернатива B использует расширение переменных, при котором переменные внутри строки, разделенной двойными кавычками, расширяются до их значений во время оценки.

Не обязательно лучше или предпочтительнее, но если вы, например, должны иметь строки, разделенные одинарными кавычками, вам придется использовать альтернативу A.

Конечно, ни один из них не является предпочтительным для построения запросов SQL со связанными параметрами, так как это не делает вас уязвимыми для атак SQL-инъекцией.

0 голосов
/ 06 февраля 2009

Вы также можете сделать это:

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

, что полезно для выделения таких вещей, как:

$sql="SELECT * FROM exempel WHERE id = {$row[id]}";
0 голосов
/ 06 февраля 2009

Когда 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".

0 голосов
/ 05 февраля 2009

Помимо того, что уже было сказано, я считаю наилучшей практикой, если я пишу запрос, написать его так:

$ sql = "SELECT * FROM table WHERE uid =". $ uid. "LIMIT 1";

Причина написания SQL-кода такова: 1. MySQL-запрос не должен анализировать переменные PHP в Query, а 2 - теперь вы легко читаете и управляете запросом.

0 голосов
/ 05 февраля 2009

в 'alt B', $ q должно быть int или float или другим числовым значением

в 'alt A', $ q может быть любой строкой, int и т. Д.

Единая кавычка делает это возможным. Иногда трудно увидеть, смотрите ли вы на него впервые.

...