Кодирование значения параметра для SELECT в PHP-MySQL

Alt A ниже – инструкция из учебника phpmysql. Он работает так, как должен.
Я обнаружил, что значение 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"; 

Related of "Кодирование значения параметра для SELECT в PHP-MySQL"

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

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

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

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

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

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

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

$ sql = "SELECT * FROM table WHERE uid =". $ uid. «ПРЕДЕЛ 1»;

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

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

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

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

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

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

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

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

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