В PHP, как я могу избежать одиночных кавычек в моей строке перед вставкой в ​​таблицу MySQL? - PullRequest
0 голосов
/ 14 октября 2011

У меня много текста для вставки в таблицу MySQL с использованием PHP. Часть текста выглядит следующим образом:

Yes, this is 'great'!

Чтобы заполнить это в операторе SQL, мне нужно экранировать '.

Я использую ereg-replace $text=mb_ereg_replace("'","\\'", $text); для выполнения следующей работы:

$sql="insert into mytable (msg) values ('".$text."')";

Теперь я обнаружил, что есть и другой текстовый стиль, где я должен сохранить в MySQL что-то вроде этого:

As you can see the \' world\' is a "disc"!

Поэтому я попытался добавить еще mb_ereg_replace, как это:

$text=mb_ereg_replace("'","\\'", $text);
$text=mb_ereg_replace("\\","\\\\", $text);

Но это не работает, я просто получаю сообщение об ошибке: PHP Warning: mb_ereg_replace(): mbregex compile err: end pattern at escape in [...]

Что вызывает это? Я, вероятно, сделал какую-то ошибку, но не могу ее найти!

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

Используйте mysql_real_escape_string для экранирования строк.

$text = mysql_real_escape_string($text);

Или лучше использовать PDO и параметризованные запросы.

1 голос
/ 29 апреля 2015

Есть гораздо лучший способ, и вам не нужно будет беспокоиться о том, чтобы снова убежать от своих строк. Использование подготовленных операторов в mysqli или PDO сделает большие запросы (те, которые содержат много строк) намного быстрее, они безопасны, вам не нужно беспокоиться о (большинстве типов) внедрения SQL, и их легко выполнить учить. строки будут просто приняты как есть в вашей базе данных без риска нарушения вашего кода.

Вот пример с mysqli:

$conn = new mysqli($servername, $username, $password, $dbname);

$stmt = $conn->prepare("INSERT INTO table (columnname) VALUES (?)");
$stmt->bind_param("s", $text);
$stmt->execute();
$stmt->close();

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

Вот то же самое, используя PDO. По сути, это делает одно и то же, но имеет преимущество как в работе с несколькими различными типами баз данных (такими как, например, Oracle или PostgreSQL), так и в некоторой степени изящной модификации из-за связанных классов.

    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $conn->prepare("INSERT INTO table (columname)
        VALUES (:text)");
        $stmt->bindParam(':text', $text);
        $stmt->execute();
    catch(PDOException $e)
        {
        echo "Oops, didn't work: " . $e->getMessage();
        }
    $conn = null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...