2009-02-11 7 views
0

Я пытаюсь написать someting в БД с помощью PHP, но если я попытаюсь использовать mysql_real_escape_string(), я не получаю никаких ошибок, но ничего не сохраняется в БД, и я не знаю, почему =/специально, потому что я сделал то же самое на другой PHP файл, и он работал отлично ...Почему mysql_real_escape_string() не работает?

<?php 
if(isset($_POST['reporte'])) 
    $falla = $_POST['reporte']; 
else  
    $falla = ""; 

if(!isset($falla)){ 
    echo '<font color="red">Intentó enviar una forma vacía. Por favor intente de nuevo.</font>'; 
}else{ 
$fecha = mysql_real_escape_string(stripslashes($_POST['fecha'])); 
$usuario = mysql_real_escape_string(stripslashes($_POST['usuario'])); 

connection... 

$sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die('mysql_error()'); 

теперь я не проверить, если «Fecha» или «Новичок» пустуют, так как они посылаются через скрытое поле в форме.


Редактировать

Я переключатель там до сих пор нет ошибок и ничего не попадает в дб =/Я смотрю на документации, но я озадачен, потому что я сделал это раньше точно так же, как и он работал ... ха-ха ...


Edit 2

Y эс У меня есть

mysql_query($sql) or die('Error SQL !'.$sql.'<br>'.mysql_error()); 

Да я установить $ tbl_name вместе с соединением в:

$host="localhost"; 
$username="user"; 
$password="pass"; 
$db_name="cosa"; 
$tbl_name="reportes"; 

, и я сделал чек на мониторе базы данных и распечатать его ... он возвращает OK ... однако, что вы подразумеваете под «дезинфекцией» $ falla? Я понимаю инъекцию, но я совершенно новый с php как таковой.


Редактировать 3

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


Edit 4

Это мой текущий код:

<?php 
if(isset($_POST['reporte'])) 
    $falla = $_POST['reporte']; 
else  
    $falla = ""; 

if(!isset($falla)){ 
    echo '<font color="red">Intentó enviar una forma vacía. Por favor intente de nuevo.</font>'; 
}else{ 

    $host="localhost"; // Host name 
    $username="user"; // Mysql username 
    $password="pass"; // Mysql password 
    $db_name="cosa"; // Database name 
    $tbl_name="reportes"; // Table name 

    // To protect MySQL injection 
    $fecha = mysql_real_escape_string(stripslashes($_POST['fecha'])); 
    $usuario = mysql_real_escape_string(stripslashes($_POST['usuario'])); 
    $falla = mysql_real_escape_string(stripslashes($falla)); 

    $db = mysql_connect($host, $username, $password) or die('Cannot Connect '.mysql_error()); 
    mysql_select_db($db_name) or die('Cannot select DB '.mysql_error()); 

    $sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die('mysql_error()'); 

    mysql_query($sql) or die('Error SQL !'.$sql.'<br>'.mysql_error()); 

    header("location:../../user/usuario.php"); 
    mysql_close();  
} 
?> 

Это полный один, а также изменяется в соответствии с рекомендациями, я получаю здесь ... еще что-нибудь в БД не получаю ...

+0

Можете ли вы отредактировать исходный образец кода, чтобы показать, что у вас есть сейчас? – nickohrn

+0

«sanitize» Я имею в виду «escape-символы, которые являются специальными для базы данных» - как вы делали в $ fecha = mysql_real_escape_string (stripslashes ($ _ POST ['fecha'])); – Piskvor

ответ

15

Я думаю, что вам может понадобиться, чтобы открыть mysql до использования mysql_real_escape_string. См. Документацию.

EDIT

Попробуйте это, но какие типы данных на вашем столе? Являются ли все поля (usuario, comentario, fecha, estado) строками? Полагаю, это то, о чем говорит ваше заявление о вставке.

<?php 
if(isset($_POST[ 'reporte' ])) { 
    $falla = $_POST[ 'reporte' ]; 
} else { 
    $falla = ""; 
} 

if(!isset($falla)) { 
    echo '<font color="red">Intentó enviar una forma vacía. Por favor intente de nuevo.</font>'; 
} else { 

    $host = "localhost"; // Host name 
    $username = "user"; // Mysql username 
    $password = "pass"; // Mysql password 
    $db_name = "cosa"; // Database name 
    $tbl_name = "reportes"; // Table name 


    $db = mysql_connect($host, $username, $password) or die('Cannot connect ' . mysql_errno()); 
    mysql_select_db($db_name) or die('Cannot select DB ' . mysql_error()); 

    $fecha = mysql_real_escape_string(stripslashes($_POST[ 'fecha' ])); 
    $usuario = mysql_real_escape_string(stripslashes($_POST[ 'usuario' ])); 
    $falla = mysql_real_escape_string(stripslashes($falla)); 

    $sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die('mysql_error()'); 

    mysql_query($sql) or die('Error SQL !' . $sql . '<br>' . mysql_error()); 

    // You need a URL here, not a relative path 
    header("Location:../../user/usuario.php"); 
    mysql_close(); 
} 
?> 
+0

string mysql_real_escape_string (строка $ unescaped_string [, resource $ link_identifier]) - хотя идентификатор ссылки можно предположить, для этого все еще должно существовать соединение. Это похоже на запуск mysql_query без подключения. – Syntax

+0

Да, mysql_real_escape_string отправляет данные на сервер MySQL, который будет экранирован ... вот как он отличается от mysql_escape_string. – Powerlord

0

Прежде всего, я предполагаю, что у вас есть mysql_query($sql) ниже: последняя строка вашего примера никогда не будет die(), поскольку Вы создаете строку там.

Во-вторых, вы установили $tbl_name?

В-третьих, попробуйте распечатать $sql, проверьте его, и если это кажется правильным, попробуйте его в мониторе базы данных или любом используемом вами графическом инструменте; посмотрите, действительно ли данные попадают в базу данных (попробуйте INSERT, затем SELECT данные, которые вы только что вставили).

кстати вы действительно должны дезинфицировать $falla как вы продезинфицировать $fecha и $usuario - mysql_real_escape_string(stripslashes($falla)); или что-то подобное. В противном случае $_POST['reporte']$falla) становится вектором для SQL injection.

1

Проверьте выход mysql_error

общего пользования-шаблон для расширения тузд является:

mysql_query($sql) or trigger_error(mysql_error()); 
1

Вам не нужно ошибка проверки в конце $ SQL вар:

$sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0')" or die('mysql_error()'); 

Это утверждение, таким образом, ничто не может или умереть при неудаче. Попробуйте изменить его на следующее:

$sql = "INSERT INTO $tbl_name(usuario, comentario, fecha, estado) VALUES('$usuario','$falla','$fecha', '0');" 

Не уверен, что если его обязательно является причиной вашей ошибки, но это не требуется, не меньше.

Кроме того, я запустил ваш код за вычетом перенаправления заголовка, и, как уже упоминалось, nickohrn вам нужно подключиться к серверу mysql перед использованием mysql_real_escape_string. Код работал нормально, локально запись была в базе данных.

Попробуйте запустить код без вызова header().

1

Пожалуйста, попробуйте другой способ. Используйте PEAR: DB или аналогичную фреймворк, чтобы использовать подготовленные инструкции вместо этого escaping hackery. Вызывающие функции, такие как mysql_real_escape_string и stripslashes, - это идеальный способ ввести странные ошибки и проблемы с SQL-инъекциями, в результате чего вы получите слишком много или слишком мало черт в ваших данных.

0

Потому что он уступает методу подготовки() MySQLi и PDO.

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