Волшебная цитата и mysql_real_escape_string

#php #slash

#php #косая черта

Вопрос:

Вот исходный код:

        if (($handle = fopen($source_file, "r")) !== FALSE) {
    $columns = fgetcsv($handle, $max_line_length, ",");
    foreach ($columns as amp;$column) {
        $column = str_replace(".","",$column);
    }
    while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
        while(count($data) < count($columns)) {
            array_push($data, NULL);
        }
        $c = count($data);
        for($i = 0; $i < $c; $i  ) {
            $data[$i] = "'{$data[$i]}'";
        }

        $sql[] = '(' . implode(',', $data) . ", '" . $_POST['custgroup'] . "'," . $_POST['user_id'] . ')';
    }


$query = "INSERT INTO $target_table (" . implode(',', $columns) . 
      ',custgroup,user_id) VALUES ' . implode(',', $sql);


    //mysql_query($query) or trigger_error(mysql_error());
    echo $query;
    fclose($handle);
}
  

Но однажды я добавил mysql_real_escape_string:

    $query = "INSERT INTO $target_table (" . implode(',',array_map('mysql_real_escape_string', $columns)) . 
          ',custgroup,user_id) VALUES ' . implode(',',array_map('mysql_real_escape_string', $sql));
  

Запрос станет :

INSERT INTO UserAddedRecord (lastname,firstname,ceLL,fax,email,code,custgroup,user_id) VALUES ('Last','First','01122331','','abc@hotmail.com','12345', '',17)

Я проверил свой php.ini и get_magic_quotes_gpc (), волшебная цитата отключена.

magic_quotes_gpc = Выкл.

magic_quotes_runtime = Выкл.

magic_quotes_sybase = Выкл.

В чем должна быть проблема? или я должен просто применить stripslashes()? Но я предполагаю, что это будет использоваться только тогда, когда включена magic quote.

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

1. Что в $columns и $sql ? Пожалуйста, отредактируйте свой вопрос, чтобы включить его.

2. Вы используете PHP и mysql, но не используете PDO. почему это?

3. @MattEllen Я пытался, но получаю ошибки, потому что я не очень знаком с PDO при использовании implode.

Ответ №1:

Вы должны сделать что-то вроде:

  • использовать mysql_real_escape_string для всех строковых значений
  • приведите все промежуточные значения к (int)
  • после этого примените окружающие одинарные кавычки ( ‘ )

Смысл mysql_real_escape_string заключается в экранировании специальных символов в вашем тестовом контенте, поэтому использование косых черт уберет это.

Другой способ решить эту проблему — посмотреть, preparedStatements где вам не нужно выполнять esacping на стороне клиента.

Просто помните, что весь смысл этого заключается в предотвращении SQL-инъекции и действуйте соответственно 🙂

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

1. Спасибо, Эдориан, я пробовал PreparedStatements раньше, но в итоге получались ошибки, теперь я пробую снова, и, кажется, это работает. Еще раз спасибо .