Теперь, когда я отправляю персонажа '
я получаю следующую ошибку, указанную ниже, а затем, когда я отправляю слова, все в порядке. Я использую htmlentities()
и я все еще получаю эту ошибку.
Как я могу предотвратить эту ошибку, существует ли способ разрешить или преобразовать или остановить отображение символа в качестве ошибки?
Вот ошибка, которую я получаю.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''')'
Вам нужно избегать строк, которые вы отправляете в своих SQL-запросах.
Для этого вы можете использовать функцию mysql_real_escape_string
.
Например, ваш код может выглядеть так (не проверен, но что-то вроде этого должен сделать трюк) :
$str = "abcd'efh"; $sql_query = "insert into my_table (my_field) values ('" . mysql_real_escape_string($str) . "')"; $result = mysql_query($sql_query);
Другое решение (потребует больше работы, хотя, поскольку вам придется менять больше кода) было бы использовать подготовленные инструкции; либо с mysqli_*
либо с PDO, но не возможно с помощью старого расширения mysql_*
.
Изменить: если это не сработает, можете ли вы изменить свой вопрос, чтобы дать нам больше информации? Как часть кода, которая вызывает ошибку?
поместите ваш SQL-запрос в переменную, например
$query = "SELECT * FROM table WHERE field= ".mysql_real_escape_string($var).""; echo $query; $result = mysql_query($query);
вы можете проверить, что фактически отправлено mysql в качестве запроса
Вы должны избегать строк, используя соответствующий метод. Вы не указали, какие функции PHP вы используете, поэтому трудно догадаться. Вы должны опубликовать соответствующий фрагмент PHP, но вот несколько примеров:
$text = "x'x"; // MySQL extension mysql_query($db, "INSERT INTO table VALUES ('" . mysql_real_escape_string($text, $db) . "')"); // MySQLi extension $db->query("INSERT INTO table VALUES ('" . $db->mysql_real_escape_string($text) . "')"); // PDO's prepared statement $stmt = $pdo->prepare('INSERT INTO table VALUES (:myvalue)'); $stmt->execute(array( 'myvalue' => $text )); // Another example $stmt = $pdo->prepare( 'SELECT * FROM users WHERE first_name = :first AND last_name = :last' ); $stmt->execute(array( 'first' => 'John', 'last' => 'Smith' )); foreach ($stmt as $row) { echo $row['user_id']; }
Я настоятельно рекомендую использовать подготовленные заявления PDO , он короче в типе и проще в использовании в долгосрочной перспективе.