为什么mysql_real_escape_string()不起作用?

时间:2009-02-11 18:31:30

标签: php sql

我正在尝试使用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”是否为空,因为它们是通过表单中的隐藏字段发送的。


修改

我做了切换,仍然没有错误,没有任何东西进入db = /我正在查看文档,但我很困惑,因为我在完全相同的方式之前完成了这个并且它有效...哈哈...


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

我在数据库监视器中完成了检查并打印出来......它返回OK ...但是,你说“清理”$ falla是什么意思?我认识到注射,但我本身就是新手。


编辑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 个答案:

答案 0 :(得分:15)

我认为您可能需要在使用mysql_real_escape_string之前打开mysql连接。请参阅文档。

修改

试试这个,但你桌子上的数据类型是什么?所有领域(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 :(得分:1)

检查mysql_error

的输出

mysql扩展的一般用法模式是:

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

答案 2 :(得分:1)

您不需要在$ sql var:

的末尾进行错误检查
$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_real_escape_string之前连接到mysql服务器。代码工作正常,本地记录进入数据库。

尝试在没有header()调用的情况下运行代码。

答案 3 :(得分:1)

请尝试另一种方式。使用PEAR:DB或类似框架来使用预准备语句而不是这个转义hackery。调用mysql_real_escape_string和stripslashes等函数是引入奇怪错误和SQL注入问题的完美方式,最终会导致数据中的斜线过多或过少。

答案 4 :(得分:1)

因为它不如MySQLi和PDO的prepare()方法。

答案 5 :(得分:0)

首先,我假设你的下面有mysql_query($sql):你的例子的最后一行永远不会die(),因为你只是在那里创建一个字符串。

其次,您是否设置了$tbl_name

第三,尝试打印$sql,检查它,如果它看起来是正确的,请在数据库监视器或您使用的任何GUI工具中尝试;查看数据是否实际上在数据库中结束(尝试INSERT,然后选择刚刚插入的数据)。

顺便说一句,你真的要清理$falla,就像你已经清理过$fecha$usuario - mysql_real_escape_string(stripslashes($falla));或类似的东西一样。否则,$_POST['reporte'](和$falla)将成为SQL injection的向量。