【问题标题】:Why won't mysql_real_escape_string() work?为什么 mysql_real_escape_string() 不起作用?
【发布时间】:2010-10-06 23:49:12
【问题描述】:

我正在尝试使用 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 是什么意思?我认识注入,但我对 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();    
}  
?>

这是完整的,并且根据我在这里得到的建议进行了更改...仍然没有将任何内容放入数据库...

【问题讨论】:

  • 您能否编辑您的原始代码示例以准确显示您现在拥有的内容?
  • “清理”我的意思是“数据库专用的转义字符”——就像你在 $fecha = mysql_real_escape_string(stripslashes($_POST['fecha']));

标签: php sql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    请尝试其他方式。使用 PEAR:DB 或类似框架来使用准备好的语句,而不是这种逃避黑客。调用 mysql_real_escape_string 和 stripslashes 等函数是引入奇怪错误和 SQL 注入问题的完美方法,最终导致数据中的斜杠过多或过少。

    【讨论】:

      【解决方案3】:

      您不需要在 $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() 调用的情况下运行您的代码。

      【讨论】:

        【解决方案4】:

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

        编辑

        试试这个,但是你表上的数据类型是什么?所有字段(usuario、commentario、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( );
        }
        ?>
        

        【讨论】:

        • string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] ) - 即使可以假设链接标识符,仍然需要存在连接才能使其工作。这类似于在没有连接的情况下运行 mysql_query。
        • 是的,mysql_real_escape_string 将数据发送到 MySQL 服务器进行转义......这就是它与 mysql_escape_string 的不同之处。
        【解决方案5】:

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

        二、你设置$tbl_name了吗?

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

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

        【讨论】:

          【解决方案6】:

          检查mysql_error的输出

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多