#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 раньше, но в итоге получались ошибки, теперь я пробую снова, и, кажется, это работает. Еще раз спасибо .