Базовое форматирование SQL Select Statement в PHP - PullRequest
2 голосов
/ 13 марта 2011

У меня есть база данных Палаты и Сената с возможностью поиска, и я просто хочу создать простую веб-страницу, которая может выполнять поиск в этой базе данных.Единственная проблема заключается в том, что, хотя мне удобно писать операторы выбора SQL, как правильно отформатировать их для использования в PHP?

Например, вот мой переключатель для выбора сенаторов по состоянию:

$sql = "";
if ($_POST['pkChamber'] == "Senate") {
    if ($_POST['pkParty'] == "Y") {
        $sql = SELECT * FROM senateinfo
               WHERE state =  (Variable = "stname")
               ORDER BY last_name, first_name');
    }
    else
    {
        $sql = SELECT * FROM senateinfo
               WHERE state =  (Variable = "stname")
               ORDER BY last_name, first_name
    }
}

Ответы [ 5 ]

3 голосов
/ 13 марта 2011

Я не уверен, что вы просите, но у меня есть хороший пример надежного и безопасного способа динамического построения оператора WHERE:

$w     = array();
$where = '';

if (!empty($_GET['rooms']))     $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space']))     $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";

if (count($w)) $where = "WHERE ".implode(' AND ',$w);
$query = "select * from table $where";

Надеюсь, это поможет.

2 голосов
/ 13 марта 2011

Ваш запрос выглядит нормально.Я думаю, что вам просто нужно понять некоторые тонкости разбора строк в PHP.

Когда вы используете двойные кавычки ("), чтобы заключить строку, PHP фактически попытается проанализировать ее, ища переменные и / илисначала нужно обработать другой php-код. Примерно так:

$sql = "SELECT * FROM table WHERE state = '{$state}' AND user = {$user->id}";

PHP заменит $ state для того, что определено в этой переменной, и то же самое для идентификатора любого пользователя, созданного в этом классе. (Такжевам не нужно переносить простые переменные в {}. Это помогает с удобочитаемостью, но требуется только для методов / переменных класса.)

Если вы используете одинарные кавычки (') для заключения строки,PHP просто обрабатывает его как нормальный. Для вашего запроса выше я бы предложил заключить его в одинарные кавычки, например:

$sql = 'SELECT * FROM senateinfo WHERE state =  (Variable = "stname") ORDER BY last_name, first_name)';

Если вы хотите использовать переменные позже в этом запросе, вам нужно будет экранироватьдвойные кавычки, которые там есть, вот так:

$sql = "SELECT * FROM senateinfo WHERE state =  (Variable = \"stname\") ORDER BY last_name, first_name)";

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

1 голос
/ 13 марта 2011

Вам нужно сосредоточиться на одной проблеме за раз.

Старайтесь избегать написания SQL на PHP, пока не разберетесь со строками в PHP и не узнаете, как вводить переменные в эти строки. Итак:

Читайте о строковых кавычках в PHP (двойные кавычки против одинарных кавычек, и да, HEREDOC)

Читайте о переменных в строках в PHP (обратите внимание, что если у него нет знака доллара, это CONSTANT, а не строковая переменная. Начните прямо с $ strings и $ переменных, где они должны быть используется, а не CONSTANTs, которые превращаются в строки, только если ничего больше не доступно.)

Читайте о связывании SQL в PHP. Все остальное приведет вас по пути SQL-инъекции . Если в вашем PHP SQL используются только голые строки, то вы настраиваете себя на неудачу, когда, наконец, развертываете свои веб-скрипты в жестком и беспощадном Интернете. В нем полно акул, готовых воспользоваться преимуществами сценариев, подверженных SQL-инъекциям.

Вот пример кода, который я ежедневно использую для привязки SQL, сосредоточенного вокруг пользовательской функции, которая упрощает:

query("select * where someTable where someTable_id = :bound_id", array(':bound_id'=>13)); 

Я могу предложить вам функцию для создания связанного SQL, просто позже (когда я на самом деле за компьютером, а не с мобильного), если вам интересно.

1 голос
/ 13 марта 2011

Я использую HEREDOC s для записи нетривиальных запросов:

$sql = <<<EOL
SELECT blah, blah, blah
FROM table
WHERE (somefield = {$escaped_value}) ...
ORDER BY ...
HAVING ...
EOL;

Функция Heredocs работает так, как если бы вы делали обычную строку в двойных кавычках, но с преимуществом отсутствия внутренних кавычек. Переменная интерполяция работает как положено, и вы также можете делать отступы для текста, поэтому ваш запрос выглядит красиво отформатированным

0 голосов
/ 13 марта 2011

Я всегда так делаю, чтобы это выглядело красиво.

$sql = "SELECT * FROM senateinfo " .
       "WHERE state =  (Variable = "stname") " .
       "ORDER BY last_name, first_name')";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...