Почему функция addlashes () не работает с моим массивом в php? - PullRequest
1 голос
/ 01 мая 2011

У меня есть ряд переменных сеанса в массиве. Когда я использую кавычки в одной из моих строковых переменных, я пытаюсь добавить косую черту, чтобы в конце концов вставить ее в БД, но функция addlashes () не работает. Вот пример.

В поле для комментариев я пишу:

Это "комментарий"

Я понимаю, что это проблема, поэтому я добавил функцию, прежде чем ввести ее в базу данных, которая проходит через ряд переменных Session, включая переменную comments.

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

        foreach($strip_fields as $key => $value) {
            $key = addslashes($key);
        }

После запуска этой функции я пытаюсь отобразить переменную комментариев $ _SESSION ['comments']

Это «комментарий»

Итак, я вижу, что функция addlashes почему-то не работает так, как я ее использую. Почему функция addlashes не работает так, как я ее использую?

ЭТО МОЕ РЕШЕНИЕ (я использовал немного из обоих предложений)

$strip_fields = array(
            'employee_id', 'approved_by', 'delivery_email', 'full_name', 
            'first_name', 'last_name', 'title', 'title_2', 'dept_div', 
            'dept_div_2', 'email', 'comments', 'special_instructions'
        );

        foreach($strip_fields as $key) {
            $_SESSION[$key] = $conn->real_escape_string($_SESSION[$key]);
        }

Ответы [ 5 ]

5 голосов
/ 01 мая 2011

Ваш вопрос подразумевает, что вы действительно хотите изменить содержимое вашей переменной $_SESSION, но это не кажется хорошей идеей, так как вы просто добавите слэш снова и снова при каждом вызове скрипта (простонаблюдение, не увидев весь ваш код).

Кроме того, вы не должны использовать addslashes для экранирования базы данных, поскольку каждая база данных (или уровень абстракции базы данных) имеет свой собственный способ экранирования данных (дляпример mysql_real_escape_string или операторы, подготовленные PDO).

Кроме того, $_SESSION и база данных - это разные способы сохранения данных, и вполне возможно, что их смешивание является плохим выбором дизайна.

РЕДАКТИРОВАТЬ ПОСЛЕ КОММЕНТАРИИ ...

Если вы хотите поместить все эти переменные в базу данных, и до этого они находятся в $_SESSION (что, как указывалось ранее, может быть не самой лучшей идеей), и вывы используете mysql php модуль , тогда вы можете сделать что-то вроде:

$db_names=array(
    "comments",
    "employee_id",
    "approved_by",
    "full_name",
    "first_name",
    "last_name"
);
$clean=array();
foreach($db_names as $name)
    $clean[$name]=mysql_real_escape_string($_SESSION[$db_name]);
mysql_query("
        INSERT INTO comments_table 
        (
            comments,
            employee_id,
            approved_by,
            full_name,
            first_name,
            last_name
        )
        VALUES
        (
            '{$clean["comments"]}',
            '{$clean["employee_id"]}',
            '{$clean["approved_by"]}',
            '{$clean["full_name"]}',
            '{$clean["first_name"]}',
            '{$clean["last_name"]}'
        )
");

Однако лучше не использовать модуль mysql, а вместо этого использовать mysqli или PDO .У каждого есть разные (и лучше по ряду причин) способы экранирования строк.

2 голосов
/ 01 мая 2011

Здесь несколько вещей не так:

  1. Вы копируете значения из $_SESSION в новые переменные.
  2. Вы передаете ключи addslashes(), но вы поместили значения в значения массива.
  3. foreach() копирует значения из массива в $key и $value, поэтому вы работаете с копией копии.

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

$strip_fields = array(
        'comments', 'employee_id', 'approved_by', 'delivery_email', 
        'full_name', 'first_name', 'last_name']
    );

foreach($strip_fields as $key) {
    $_SESSION[$key] = addslashes($_SESSION[$key]);
}
1 голос
/ 01 мая 2011

НЕ ИСПОЛЬЗОВАТЬ addslashes() ЧТОБЫ УДАЛИТЬ ЗНАЧЕНИЯ ДЛЯ SQL-ЗАПРОСА! (извините за крики)

В случае MySQL вы выбираете mysql_real_escape_string(), но другие движки имеют свои собственные функции escape. addslashes() удивительно легко "обмануть", если вы пытаетесь провести атаку SQL-инъекцией.

Лучшее, что вы можете сделать, - это не экранировать $_SESSION, а создать копию и использовать array_map() вместе с mysql_real_escape_string(). Таким образом, вы также можете сохранить оригинальную версию без экранирования.

$escaped_SESSION=array_map('mysql_real_escape_string', $_SESSION);

Другие уже объяснили, почему foreach не лучший выбор для манипулирования вашим массивом. Он работает с копией массива, на котором вы его запускаете. array_map() применяет обратный вызов ко всем элементам вашего массива и возвращает результирующий массив.

0 голосов
/ 01 мая 2011

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

$strip_fields = array($_SESSION['comments'],$_SESSION['employee_id'],$_SESSION['approved_by'],$_SESSION['delivery_email'],$_SESSION['full_name'],$_SESSION['first_name'],$_SESSION['last_name']);

    foreach($strip_fields as $key => $value) {
        $strip_fields[$key] = addslashes($value); // Store it back into the strip_fields var
    }

Также, как заметил @Gaurav, вы хотите очистить данные массива, а не индекс / ключ.

0 голосов
/ 01 мая 2011
$array = array('comment' => $_SESSION['comment'], 'employee_id' => $_SESSION['employee_id']);  // other keys of session

foreach(array_keys($array) as $value){
    $array[$value] = addslashes($array[$value]);
}

используйте массив $ вместо $ _SESSION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...