2012-05-03 4 views
0

Я бы очень признателен за любую помощь, которую я могу получить.mysql_real_escape_string игнорируется

У меня возникли проблемы с формой, и я не могу заставить mysql_real_escape_string работать вообще.

Я использую MySQL 5.5 с PHP и для его проверки. Я создал простую форму. Magic Quotes не включен вообще.

Использование этой формы:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 

<body> 
<form name="event_ad" action="test.php" method="post"> 
    <table> 
    <tr> 
     <td>Event Name:</td> 
     <td><input name="event_name" type="text" size="90" /></td> 
    </tr> 
    <tr> 
     <td>Start Date:</td> 
     <td><input name="start_date" type="text" size="90" /></td> 
    </tr> 
    <tr> 
     <td colspan="2" align="center"><input name="Submit" type="submit" id="Submit" value="Add New Event" /></td> 
    </tr> 
    </table> 
</form> 
</body> 
</html> 

Затем данные поступают на вход Nto таблицы с помощью test.php

<?php 
    mysql_connect("localhost","username","password") or die(mysql_error()); 
    mysql_select_db("databasename") or die(mysql_error()); 

    $name = $_POST['event_name']; 
    $sdate = $_POST['start_date']; 
    $name = mysql_real_escape_string($name); 

    $sql = "INSERT INTO tblevents (event_name, event_date) VALUES ('" . $name . "','" . $sdate . "')"; 

    mysql_query($sql); 

    echo "success"; 
?> 

(соединительные детали изменены)

Когда я ввести Имя события вывода «Rielly» Smith »он вставлен в таблицу MySQL как O'Rielly« Smith »

Там нет обратных косых червей, вообще не исчезает.

Я действительно пробовал интернет, пытаясь разобраться в этом, но кажется, что он работает для всех остальных.

Я пропустил что-то принципиальное здесь? Я был бы очень признателен, если бы кто-то мог направить меня в правильном направлении.

Это мой первый пост на этом форуме, а форматы html и кода не кажутся такими же, как и в большинстве форумов, которые я посетил, и вы не можете просмотреть предварительный просмотр, поэтому я надеюсь, что это получится ОК.

Заранее благодарите всех, кто предлагает помощь. Cheers Al.

+7

Забудьте mysql_real_escape_string. Вместо этого используйте mysqli или PDO и связанные аргументы. – Quentin

+2

Как вы знаете, что это такое? Вы повторяете «$ name»? –

+0

Извините, он не отвечает на ваш вопрос, но я настоятельно рекомендую переключиться на что-то по линии PDO. Функции Mysql устарели, начиная с версии PHP версии 5.4. –

ответ

2

Когда я ввода названия события O'Rielly «Смит» он вставляется в таблицу MySQL как O'Rielly «Смит»

Т шляпа - это то, что должно произойти.

Экранирование заставляет данные проходить запрос, чтобы исходные данные попадали в базу данных. Цель состоит не в добавлении дополнительных символов в ваши сохраненные данные, а в том, чтобы помешать символам со специальным смыслом взломать ваш SQL.

3

Это по дизайну, вы не должны видеть никаких экранированных входных данных в таблице. Это просто для вставки. Используя mysql_real_escape_string, ваш запрос выглядит

INSERT INTO tblevents (event_name, event_date) VALUES ('O\'Rielly \"Smith\"','1.4.2001')"; 

где эти обратные косые убедитесь, что вы не нарушаете апостроф

MySQL «удаляет» все обратные косые, пока они не замаскирована обратной косой черты :)

+0

+1. Экранированные данные предназначены только для анализатора запросов. Все дело в том, чтобы получить реальные данные в таблицу. – Brad

+0

Thanx Martin. Это именно то, что я искал, но, как ни странно, я ничего не мог найти. Теперь у меня есть намного лучшее понимание того, как это работает. Cheers. – Almeister9

+0

Если вам нравится мой ответ, пожалуйста, примите его, отметив его слева. Спасибо –

0

Подумайте о том, чтобы убежать как эквивалент оберточной бумаги на день рождения.

Вы избегаете данных, чтобы любые специальные символы в данных теряли свое особое значение во время процесса передачи. Когда они «находятся внутри» целевой системы (html-страница, запись базы данных и т. Д.), Экранирование больше не требуется, так как место, где они могли повлиять на процесс, уже закончено.

То же самое с обернутым подарком - как только настоящее получено, вам больше не нужна бумага для обертывания, поэтому она удаляется.

0

Он отлично справился.

Извлечение mysql_real_escape_string предотвратит вставку данных.

+0

Я начинаю понимать сейчас, но, к сожалению, если я удалю mysql_real_escape_string, данные по-прежнему будут вставлены в таблицу, независимо от того, как там находятся данные. Вот почему я смущаюсь. – Almeister9

0
$name = $_POST['event_name']; 
$sdate = $_POST['start_date']; 


$db = new mysqli("localhost", "username", "password", "databasename"); 

$query = "INSERT INTO tblevents (event_name, event_date) VALUES (?, ?)"; 
$statement = $db->prepare($query); 
$statement->bind_param("ss", $name, $sdate); 

$statement->execute(); 
$statement->close(); 

$db->close(); 

(я оставил из проверки ошибок для подключения)

Смежные вопросы