2014-01-16 3 views
2

Я использую PHP для подключения к базе данных SQL с помощью sqlsrv драйверов. Однако у меня возникла проблема:Apostrophe не входит в базу данных SQL

$string = "Home"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('" .$string. "')"); 
$DBH->execute(); 

Как это работает?

$string = "Home's"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('" .$string. "')"); 
$DBH->execute(); 

Но это не так?

База данных SQL, похоже, не принимает апостроф в переменной $string. В прошлом я использовал бы mysql_real_escape_string, но это не вариант.

+1

НОО и не работает слова никто не понимает здесь , Найдите ошибку. PDO имеет метод цитаты http://www.php.net/manual/en/pdo.quote.php –

+1

Вы страдаете от SQL-инъекции - вот [как исправить это] (http://stackoverflow.com/questions/ 60174/how-can-i-prevent-sql-injection-in-php) –

+1

«Раньше я использовал бы mysql_real_escape_string, но это не вариант». Это означает, что вы знаете, в чем проблема. Используйте подготовленные заявления. –

ответ

2

Это происходит потому, что вы используете подготовленное заявление ... но не готовите какой-либо вход, а просто хлопая значение в SQL. Глядя на нее, должны понять:

Пример 1:

$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('Home')"); 

экс 2:

$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('Home's')"); 

Посмотрите, как ваш процитировать теперь перепутались?

Правильный способ сделать это состоит в acutally ИСПОЛЬЗОВАТЬ функциональность подготовленной инструкции по:

$string = "Home's"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES (:column_name)"); 
$DBH->bindParam(':column_name', $string); 
$DBH->execute(); 

Обратите внимание, как ваше заявление сначала приготавливают с параметром :column_name готов принять значение. Затем bindParam вводит значение и выполняет его.

Теперь даже можно повторно использовать готовить с новыми значениями:

$string = "Home's Holmes is homing"; 
$DBH->execute(); 
+0

Я забыл о ООП с PHP, спасибо за урок переподготовки – proPhet

-1

Я думаю, вам нужно избежать апострофа, используя двойной апостроф. после того, как вы сделаете вставку, проверьте данные в таблице, она должна показывать только один апостроф.

$string = "Home''s"; 
$DBH->prepare("INSERT INTO table_name (column_name) VALUES ('" .$string. "')"); 
$DBH->execute(); 

удачи ...

+0

Это не проблема с экранированием строк, это проблема SQL-запроса. –

+0

в SQL apostrophes необходимо сбежать .. Вставить в Person (первый, последний) Значения ('Joe', 'O''Brien') –

+0

Это приемлемо для статических запросов, но я уверен что '$ string =" Home's ";' является просто упрощенным тестовым случаем. Библиотеки SQLSRV поддерживают достойную подготовку операторов. –

0

sqlsrv documentation page есть достойные примеры того, как использовать подготовленные заявления:

$sql = "INSERT INTO table_name (column_name) VALUES (?)"; 
$params = array("Home's");  
$stmt = sqlsrv_query($conn, $sql, $params); 
Смежные вопросы