Вставка данных с использованием PHP в mysql, когда он содержит - PullRequest
1 голос
/ 04 июня 2010

Я записываю много информации из файла XML в базу данных.

Все работает нормально, пока я не наткнулся на поле с 'в описании, что вставка завершается с ошибкой

Error

1064:You have an error in your SQL syntax; check the manual that

соответствует вашему серверу MySQL версия для правильного использования синтаксиса Я бы хотел, чтобы ты тоже так чувствовал. Мы хотели бы, чтобы вы посетили нас, чтобы посмотреть более 100 'в строке 3

Есть ли способ вставить это без сбоев? файл импорта может быть большим и регулярно изменяться, поэтому я не могу искать и заменять символы внутри него.

Мой фактический оператор PHP:

$query = mysql_query("REPLACE into list
(id, name, link, description, cost, date_added,type,myipaq,private,imgurl)
VALUES ('$id','$name','$link',"'$description'",'$cost','$date','$type','$myipaq','$private','$imgurl')");

заранее спасибо,

Грег

Ответы [ 5 ]

6 голосов
/ 04 июня 2010

Это относится к категории SQL-инъекций.

В PHP функция: mysql_real_escape_string используется для кодирования строки, чтобы ни одна из них не могла повлиять на оператор SQL, в который она может быть объединена.

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

API REF: http://php.net/manual/en/function.mysql-real-escape-string.php

1 голос
/ 04 июня 2010

Просто передайте свои данные через mysql_real_escape_string()

0 голосов
/ 04 июня 2010

Единственный действительно безопасный способ вставки, замены или взаимодействия с чем-либо в базе данных с помощью PHP - это использование подготовленных операторов.На самом деле больше нет оправдания тому, чтобы делать это любым другим способом.Экранирование строк с использованием mysql_real_escape_string даст вам некоторую защиту, но это не является пуленепробиваемым.

Подготовленные операторы даже не сложны.См. Страницу руководства по PHP на них, и есть несколько оберток, которые сделают жизнь еще проще, лично мне очень нравится обертка codesense mysqli , и я уже давно пользуюсь ею безпроблемы - это не сложнее, чем прямой MySQL PHP-код. EasyPDO также выглядит многообещающе.

Вам следует проверить соответствующий вопрос "PHP: Is mysql_real_escape_string" достаточно для очистки ввода пользователя " для получения дополнительной информации о том, почему вы не должныне ленись.

0 голосов
/ 04 июня 2010

Используйте мою удобную функцию денди:

function mysql_safe_string($value) {
    if(is_numeric($value))      return $value;
    elseif(empty($value))       return 'NULL';
    elseif(is_string($value))   return '\''.mysql_real_escape_string($value).'\'';
    elseif(is_array($value))    return implode(',',array_map('mysql_safe_string',$value));
}

function mysql_safe_query($format) {
    $args = array_slice(func_get_args(),1);
    $args = array_map('mysql_safe_string',$args);
    $query = vsprintf($format,$args);
    $result = mysql_query($query);
    if($result === false) echo '<div class="mysql-error"><strong>Error: </strong>',mysql_error(),'<br/><strong>Query: </strong>',$query,'</div>';
    return $result;
}

Вот так:

mysql_safe_query('INSERT INTO table VALUES (%s, %s, %s)', $val1, $val2, $val3);

И забудьте про цитирование или не цитирование ваших строк и запись mysql_real_escape_string десятка раз.

0 голосов
/ 04 июня 2010

Использование: php.net / manual / en / function.addslashes.php

Добавляет косые черты!

И если вы используете это, просто используйте

http://www.php.net/manual/en/function.stripslashes.php

чтобы удалить косые черты из вашей строки!

...