@vegarulez

[PHP,SQL, update] Как правильно сделать update строки со спецсимволами?

Есть в переменной строка в которой есть вот такое выражение:

...
dscr="Кем выдан" trg="0" req="0" mask="^[А-Яа-яёЁ/.\- 0-9,]{1,50}"
...

Когда делаю Update в базу этой строки - то получаю в базе
...
dscr="Кем выдан" trg="0" req="0" mask="^[А-Яа-яёЁ/.- 0-9,]{1,50}"
...

т.е. один слэш в регекспе испаряется.
вопрос как правильно апдейтить чтобы данные которые были в переменной записались в бд именно в том виде в котором были в переменной?
  • Вопрос задан
  • 1045 просмотров
Решения вопроса 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
pdo, placeholders, prepared statements и другие страшные слова из мануала.
Ответ написан
trevoga_su
@trevoga_su
Within a string, certain sequences have special meaning unless the NO_BACKSLASH_ESCAPES SQL mode is enabled. Each of these sequences begins with a backslash (“\”), known as the escape character. MySQL recognizes the escape sequences shown in Table 10.1, “Special Character Escape Sequences”. For all other escape sequences, backslash is ignored. That is, the escaped character is interpreted as if it was not escaped. For example, “\x” is just “x”. These sequences are case sensitive. For example, “\b” is interpreted as a backspace, but “\B” is interpreted as “B”. Escape processing is done according to the character set indicated by the character_set_connection system variable. This is true even for strings that are preceded by an introducer that indicates a different character set, as discussed in Section 11.1.4.5, “Character String Literal Character Set and Collation”.
dev.mysql.com/doc/refman/5.7/en/string-literals.html

нужно так экранировать слэш слэшем, как на картинке

16-1024x482.jpg

если используешь mysqli, то применяй mysql_real_escape_string или подготовленные запросы pdo/mysqli

ps это все от незнания основ. судя по вопросу, код у тебя дырявый
Ответ написан
Комментировать
@vegarulez Автор вопроса
Ребята
ThunderCat ThunderCat
trevoga_su trevoga_su
, спасибо что подсказали. Почитал, поразбирался. Переделал запрос к бд через PDO и подготовленные запросы. Ниже приведу пример того что у меня получилось, прошу вас посмотреть, может ещё какая-нить критика конструктивная будет, так как мне по идее надо бы htmlspecialchars() или htmlentities() или санитизинг делать значений из $_POST, поэтому буду признателен если откоментите как это правильнее производить
Вот пример того что у меня получилось:

const DB_HOST = 'localhost';
const DB_USER = 'xxx';
const DB_PASS = 'xxx';
const DB_NAME_ = 'xxx';

function pdo_prepquery($query,$prep_arr)
{
    try {
        $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME_, DB_USER, DB_PASS,
            array(PDO::ATTR_PERSISTENT => true,
                PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES CP1251'));
        //echo "Подключились\n";
    } catch (Exception $e) {
        die("Не удалось подключиться: " . $e->getMessage());
    }
    try {
        echo $query;
        $dbh->setAttribute(
            PDO::ATTR_ERRMODE,
            PDO::ERRMODE_EXCEPTION);
        $dbh->beginTransaction();
        $sth=$dbh->prepare($query);
        $sth->execute($prep_arr);
        $result = $dbh->lastInsertId();
        $dbh->commit();


        echo 'lastInsertId:'.$result;
        return $result;
    } catch (Exception $e) {
        $dbh->rollBack();
        echo "Ошибка[" . __FUNCTION__ . "]" . $e->getMessage();
        return false;
    }


}


// some_code up to here
$i=0;
while (// some statements) {
$query = "Update `some_table` set `a`=:a,`b`=:b, `c`=:c, `d`=123 where `e`=:e";

                            $prep_arr = array(':a' =>$_POST['some_var_a'],
                                ':b' => $_POST['some_var_b'],
                                ':c' => $some_var_c,
                                ':e' => $some_var_e);
                            $qr[$i] = pdo_prepquery($query, $prep_arr);
                            echo 'testo:' . $qr[$i];
$i++;
}

// some_code down from here
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы