Как мне добавить косую черту только к одинарным кавычкам и игнорировать двойные кавычки?

Как мне добавить косую черту только к одинарным кавычкам и игнорировать двойные кавычки? Я использую пхп. Я хотел бы избежать одинарных кавычек, чтобы предотвратить поломку моих запросов php mysql.

Благодарю вас!

Изменить: я думаю, что поиск и замена регулярных выражений будут наиболее полезными.


person atwellpub    schedule 02.05.2010    source источник
comment
Помните слова Джейми Завински: Некоторые люди, столкнувшись с проблемой, думают, что я знаю, что буду использовать регулярные выражения. Теперь у них две проблемы.   -  person Bill Karwin    schedule 02.05.2010


Ответы (5)


Что ж, preg_replace_all("/([^\])'/","$1\'",$yourStrHere) сделает то, что вы просите:

  • "/([^\])'/" дает регулярное выражение /([^\])'/, которое говорит: "сопоставить любой одиночный символ, который не является обратной косой чертой, за которой следует одинарная кавычка, и захватить символ перед кавычкой. "
  • "$1\'" говорит "заменить захваченным символом, за которым следует обратная косая черта и одинарная кавычка"

НО...

Ответ Билла о параметризованных запросах с использованием API-интерфейсов mysqli или PDO - действительно хороший совет. Проще и эффективнее позволить вашему API базы данных справиться с этим, чем делать это самостоятельно — люди, которые написали эти API (и люди, которые работали над собственным бэкэндом для этих API), вероятно, потратили больше времени и усилий на решение проблем безопасности и проблемы с производительностью, чем большинство из нас может надеяться потратить сами.

person Weston C    schedule 02.05.2010
comment
Спасибо всем за помощь. Я очень ценю все советы и ответы, они пойдут по пути. - person atwellpub; 03.05.2010

Хорошо, я действительно опаздываю на этот пост, но добавляю этот ответ в надежде, что он может помочь кому-то приземлиться на этот вопрос. В то время как @Weston C дал решение регулярного выражения, для этого есть функция php - addcslashes (http://php.net/manual/en/function.addcslashes.php):

string addcslashes ( string $str , string $charlist )
Returns a string with backslashes before characters that are listed in charlist parameter.
person Ninja    schedule 29.03.2012

Простой str_replace("'", "\\'", $string) должен работать. Но, как сказал Гамбо выше, вам следует использовать библиотечные функции, если вы пытаетесь избежать запросов MySQL.

person JW.    schedule 02.05.2010
comment
Это лучший ответ для не-запросов; по крайней мере для меня, кто занимается генерацией файлов классов. Увидев регулярное выражение, я собирался опубликовать str_replace('\'','\\\'',$str), пока не заметил это. Я просто использовал одинарные кавычки, чтобы избежать вызова проверки выражения для двойных кавычек. - person Garet Claborn; 10.04.2014

Используйте mysql_real_escape_string. Он экранирует только необходимые символы применительно к кодировке символов вашего соединения MySQL.

person Gumbo    schedule 02.05.2010
comment
mysql_real_escape_string($переменная); по-прежнему избегает двойных кавычек. - person atwellpub; 02.05.2010
comment
MySQL правильно вставит вместо \ в строку. когда вы ВЫБЕРИТЕ его, он будет отображаться как, а не как \. - person Reece45; 02.05.2010
comment
После запуска mysql_real_escape_string($variable); а затем поместить переменную в запрос; Я проверил в своем phpmyadmin, и в записи экранированы как одинарные, так и двойные кавычки. - person atwellpub; 02.05.2010
comment
@atwellpub: И это правильное поведение, поскольку для объявления строк в MySQL можно использовать двойные кавычки. Изображение у вас есть запрос типа 'SELECT * FROM table WHERE row="'.$value.'"'. Если возможные двойные кавычки в $value не экранированы, вы можете получить недопустимое строковое объявление или, поскольку вы хотите предотвратить SQL-инъекции, способ внедрения управляющих данных в ваши SQL-запросы. - person Gumbo; 02.05.2010
comment
@atwellpub: Возможно, у вас включена функция Magic Quote; если это так, отключите его. - person Gumbo; 02.05.2010
comment
Но мой вопрос заключался в том, как мне избежать только одинарных кавычек, а не двойных. Я думаю, что это работа для регулярного выражения, если только нет функции, которая позволяет вам выбрать, какой тип кавычек следует экранировать. - person atwellpub; 02.05.2010
comment
@atwellpub: нет никакой разницы, кодируете ли вы двойные кавычки внутри объявления строки в одинарных кавычках или нет: SELECT '"' = '\"' дает 1. - person Gumbo; 02.05.2010
comment
Хотя мой вопрос остается в силе. - person atwellpub; 02.05.2010

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

Вы можете использовать параметры запроса в расширении mysqli или в PDO (я предпочитаю PDO). Старое расширение mysql не поддерживает параметры запроса.

person Bill Karwin    schedule 02.05.2010