Почему не работает mysql_real_escape_string ()? - PullRequest
0 голосов
/ 11 февраля 2009

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

<?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" или "usuario" пустыми, поскольку они отправляются через скрытое поле в форме.


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

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


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

Да, у меня есть

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"; 

и я сделал проверку на мониторе базы данных и распечатал его ... он возвращает ОК ... однако, что вы подразумеваете под "очисткой" $ falla? Я узнаю инъекцию, но я совсем новичок в php.


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

Я использую die только для тестирования, однако ошибки не отображаются, он работает гладко, просто не вставит ничего, если я использую "mysql_real_escape_string ()"


Редактировать 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();    
}  
?>

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

Ответы [ 6 ]

15 голосов
/ 11 февраля 2009

Я думаю, вам может потребоваться открыть соединение 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( );
}
?>
1 голос
/ 12 февраля 2009

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

1 голос
/ 12 февраля 2009

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

1 голос
/ 12 февраля 2009

Вам не нужна проверка ошибок в конце переменной $ 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 голос
/ 11 февраля 2009

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

Общий шаблон использования для расширения mysql:

mysql_query($sql) or trigger_error(mysql_error());
0 голосов
/ 11 февраля 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...