Зачем использовать $query вместо прямой строки запроса в mysql_query(«строка»)?

#php #mysql

#php #mysql

Вопрос:

Может кто-нибудь, пожалуйста, объяснить мне, почему следующее не работает:

 mysql_query("DELETE FROM `categories` WHERE `id` = '{$id}'");
 

В то время как работает следующее:

 $query = "DELETE FROM `categories` WHERE `id` = '{$id}'";
mysql_query($query);
 

Комментарии:

1. Это вообще правда? Вызовы функций те же, но у второго есть a <br> в коде, что сделало бы его недействительным. Так что, если что-то из этого не сработает, это второе.

2. @GolezTrol Это <br> было там, потому что до того, как я отредактировал, у него не было кодовых полей. Итак, сначала я отредактировал и добавил кодовые поля, но забыл удалить <br> , поэтому я снова отредактировал и удалил <br> .

3. Спасибо за это. Мне все так же любопытно, как и прошлой ночью. Нет ответа, который действительно объясняет, почему произошла эта ошибка, и не просто случайная.

4. Хорошо, в этом случае две части кода должны выполнять одно и то же, если значение $id не отличается.

Ответ №1:

Они оба должны работать точно так же.

Попробуйте это:

 mysql_query("DELETE FROM categories WHERE id = '{$id}'");
 

Это всегда работает для меня. Но помещение его в переменную иногда упрощает работу.

Ответ №2:

Между ними нет разницы. Оба также уязвимы для SQL-инъекций. Вы должны использовать подготовленные операторы или mysql_real_escape_string .

Комментарии:

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

2. Есть способы получше, чем использование mysql_real_escape_string . Кроме того, кто сказал $id , что он еще не экранирован или даже не встроен?

3. Сначала я упомянул подготовленные операторы. $id уже может быть экранировано, хотя лучше сделать это в последнюю минуту, чтобы избежать такой путаницы. Но если это int-приведение, кавычек быть не должно.

Ответ №3:

Между ними нет функциональной разницы, но сохранение запроса в отдельной переменной упрощает отладку созданного оператора.

например

 $sql = "...";
$result = mysql_query($sql);
if ($result === FALSE) {
    echo "Query failed: ", $sql, mysql_error();
}
 

Комментарии:

1. это неправильный способ сделать это, вы должны инкапсулировать вызовы mysql_query.

2. в функции, в методе-члене или на уровне ORM… Я хотел бы кричать, когда вижу голые вызовы mysql_query.

3. Это мнение. Это ни правильно, ни неправильно. Некоторые люди предпочитают «голый металл». И когда вы знаете, что делаете, нет ничего плохого в голом металле.

4. это просто неправильно. и это не мнение. хотите проверить, не сработал ли он? хотите регистрировать созданные запросы? хотите измерить прошедшее время для каждого из них? если он не инкапсулирован, вам придется делать это во многих-многих местах. назовите мне только одну вескую причину не инкапсулировать эти вызовы! (нет, производительность не такова. дополнительный вызов функции на порядки быстрее, чем запрос к БД)

5. @yi_H 1. Тот, кто должен задать этот вопрос, возможно, еще не дорос до реализации слоев ORM. И, пожалуйста, не утверждайте, что вы делали в своем первом PHP-приложении. 2. Этот ответ — всего лишь пример получения результата функции и отображения значения запроса в «отладчике». 3. ORM отстой. Вы бы предпочли писать бизнес-объекты, которые не обязательно должны отображаться непосредственно в таблицы, но вместо этого могут записывать логические объекты независимо от того, как и где они хранятся. 4. Если вы распространяете ORM так, как вы это делаете, по крайней мере, вы должны были предложить подготовленные операторы с использованием mysqli или, скорее, PDO. 5. Упс, не хватает места.

Ответ №4:

Я подозреваю, что онлайн-примеры только начали использовать отдельную $query переменную, и люди скопировали ее, не задумываясь об этом, а затем в других примерах это реализовано, и теперь тонны людей делают это, не обязательно зная, почему. C’est la vie.