Почему строка с одинарными кавычками вызывает ошибку при вставке в БД?

Мой вопрос: как вы разрешаете одиночные кавычки в строках?

Например, у меня есть форма и текстовое поле. Он настроен так, чтобы пользователь мог ввести свое имя. Оттуда он отправляет и передает данные в базу данных.

Мне нужно иметь возможность разрешать одинарные кавычки (апостроф), поскольку имена некоторых людей имеют апостроф в их именах, например «O'Reilly».

Какие-либо предложения?

Одиночные кавычки никоим образом не запрещены. Я просто предполагаю, что вы получили ошибку, вставив ее в базу данных. Вероятно, это связано с отсутствием mysql_real_escape_string() для входных значений.

Вы получите ошибку SQL, если вы попробуете INSERT ... ('O'Reilly') что является целым рядом функций экранирования SQL.

(Вот почему magic_quotes изначально были введены: чтобы заставить SQL работать из коробки для новичков. – Не делать этого особенно безопасным.)

Используйте функцию mysql_real_escape_string () для любого текста, который вы вставляете в свою базу данных. Вы можете получить сообщение об ошибке в своем скрипте, если вы отправляете данные непосредственно в свою базу данных, потому что то, что вы на самом деле делаете, заканчивается цитатой MySQL.

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

 $q = "INSERT INTO `table` (`body`) VALUES ('".mysql_real_escape_string($_POST['body'])."')"; 

Если я правильно читаю ваш вопрос, вы закодировали ошибку SQL Injection в своей программе, позволяя слегка злонамеренным людям и вирусам читать и писать вашу базу данных. (Представьте, что кто-то печатает на машинке ';drop table users; в поле … прощайте данные.)

Самый простой способ борьбы с атаками SQL Injection – написать ваши SQL-запросы с помощью подготовленных операторов , которые просят библиотеки баз данных безопасно обрабатывать входные данные:

 <?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // insert one row $name = 'one'; $value = 1; $stmt->execute(); // insert another row with different values $name = 'two'; $value = 2; $stmt->execute(); ?> 
  USe like:- insert into question(question,points,choice1,choice2, choice3,choice4,choice3_correct,tags,error_status, base_or_derived,language) values('".mysql_real_escape_string($result4)."', '".$points."','".$ans1."','".$ans2."', '".$correct_ans."','".$ans3."','1','".$tags."', '".$error."','D','".$language."')