【问题标题】:Changing Mysql functions to Mysqli breaks the script将 Mysql 函数更改为 Mysqli 会破坏脚本
【发布时间】:2015-08-13 22:03:09
【问题描述】:

我有这个脚本可以从网站上删除某张图片。它是用 mysql 函数编写的,所以我想将其更新为 mysqli,但这样做会使脚本停止工作。没有来自脚本的消息显示没有 php 错误并添加 error_reporting(E_ALL);也不显示任何错误。

原文:

    if(isset($_POST['F3Verwijderen']))
    try 
    {                           
        //delete the file
        $sql = "SELECT PandFoto3 FROM tblpand WHERE `PK_Pand` = '".$pandid."'";

        $con = mysql_connect('WEBSITE.mysql', 'WEBSITE', 'PASS');
        if (!$con) {
        die('Could not connect: ' . mysql_error());
        }
        mysql_select_db("WEBSITE");
        $result = mysql_query($sql, $con);
        while ($row = mysql_fetch_array($result)) {                     
            if(file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$row['PandFoto3'])) {
                unlink($_SERVER['DOCUMENT_ROOT'].'/'.$row['PandFoto3']);
            } else {
            echo $row['PandFoto3'];
            }
        }
        //delete the path url from the database field
        mysql_query("UPDATE tblpand SET PandFoto3 = NULL WHERE `PK_Pand` = '".$pandid."'");
        mysql_close($con);          


        header('Location: ../admin/pand-aanpassen.php?id='.$pandid);
    }

更新到mysqli:

try 
    {                           
        //delete the file
        $sql = "SELECT PandFoto3 FROM tblpand WHERE `PK_Pand` = '".$pandid."'";

        $con = mysqli_connect('WEBSITE.mysql', 'WEBSITE', 'PASS');
        if (!$con) {
        die('Could not connect: ' . mysqli_error());
        }
        mysqli_select_db("WEBSITE");
        $result = mysqli_query($sql, $con);
        while ($row = mysqli_fetch_array($result)) {                        
            if(file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$row['PandFoto3'])) {
                unlink($_SERVER['DOCUMENT_ROOT'].'/'.$row['PandFoto3']);
            } else {
            echo $row['PandFoto3'];
            }
        }
        //delete the path url from the database field
        mysqli_query("UPDATE tblpand SET PandFoto3 = NULL WHERE `PK_Pand` = '".$pandid."'");
        mysqli_close($con);         


        header('Location: ../admin/pand-aanpassen.php?id='.$pandid);
    }

【问题讨论】:

  • 颠倒这些($sql, $con) - 先是马,然后是马车;-) 你也没有对mysqli_query("UPDATE做任何事情
  • 我改变了它,但结果相同(尽管首先是 veing wagon,然后是与旧 mysql 一起工作的马)。
  • 你没有连接到你的数据库

标签: php mysql mysqli


【解决方案1】:

编辑:

“没有 php 错误并添加 error_reporting(E_ALL); 也不显示任何错误。”

  • 那是因为这不是 PHP 问题,而是 MySQL 问题。
    • 它们完全是两种不同的动物。

正如我在评论中所说,您需要在($con, $sql) 周围切换这些变量($sql, $con)

然后这个:

$con = mysqli_connect('WEBSITE.mysql', 'WEBSITE', 'PASS');

只需使用第 4 个参数而不是 mysqli_select_db("WEBSITE"); 即可,因为您没有将连接变量传递给。

$con = mysqli_connect('WEBSITE.mysql', 'WEBSITE', 'PASS', 'WEBSITE');

语法是:

  • 主持人
  • 用户名
  • 密码(如果有)
  • 数据库

你也可以做到mysqli_select_db($con, "WEBSITE");

旁注:在mysql_ (见脚注)中,连接在最后,而mysqli_ 中的连接在前。

对您的 UPDATE 执行相同操作并首先传递连接参数。

mysqli_query($con, "UPDATE...

旁注:要验证更新是否确实成功,请使用affected_rows()

另一件事,mysqli_error() 需要连接到它 mysqli_error($con) 并检查您的查询是否有错误。

即:

$result = mysqli_query($con, $sql) or die(mysqli_error($con));

参考资料:

旁注:

您使用的是try(),但没有使用catch()。要么删除它,要么查阅手册:

从手册中提取的示例 #4:

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}

try {
    echo inverse(5) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "First finally.\n";
}

try {
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "Second finally.\n";
}

// Continue execution
echo "Hello World\n";
?>

最后的笔记:

您当前的代码对SQL injection 开放。使用prepared statementsPDO with prepared statements它们更安全


脚注:(MySQL 和 MySQLi 比较)

关于mysql_query()

混合mysql_query(字符串$query [,资源$link_identifier = NULL]

对于mysqli_query()

混合 mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 2019-01-25
    • 1970-01-01
    • 2017-06-20
    • 2010-11-26
    • 2014-07-02
    相关资源
    最近更新 更多