MySQL 仅在本地主机上工作

MySQL only working on localhost

出于某种原因,此代码在本地主机 (MAMP) 上完美运行,但由于某种原因,它在我的域上不起作用。

<?php

    require(ROOT."/resc/define.mysql.php");

    $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

    $query = 'SELECT * FROM `Products` WHERE ID = '.mysql_real_escape_string($_GET['art']);

    $resultSet = $mysqli->query($query);

    if ($resultSet->num_rows != 0) {

        while ($row = $resultSet->fetch_assoc()) {

            foreach ($row as $key => $value) {

                $$key = $value;

            }

        }

    } else {

        echo('MySQL Error!');

    }

?>
<article class="full">
    <header><h1><?php echo($Title); ?></h1></header>
    <img style="float:right;width:60%;" src="<?php echo($ImagePath); ?>">
    <footer>
        <?php echo($Ingres); ?>
    </footer>
    <br/>
    <h4>Specs:</h4>
    <ul style="padding-left:30px;">
        <?php echo($Specs); ?>
    </ul>
    <br/>
    <p style="font-size:90%;line-height:1.5;">
        <?php echo($Article); ?>
    </p>
    <div class="clearBoth"></div>
</article>

开头的require()得到一个文件,需要包含mysql登录信息的脚本。这当然是本地主机上与网络服务器上不同的文件。 Web 服务器上的此文件位于 httpd.private 中,访问方式如下:require($_SERVER['DOCUMENT_ROOT']."/../httpd.private/define.mysql.php");,并包含:

<?php
    define('DB_USER', 'myUsername');
    define('DB_PASS', 'myPassword');
    define('DB_HOST', 'myHostAddress');
    define('DB_NAME', 'myDatabaseName');
    define('DB_CHAR', 'utf8');
    define('DB_COLL', '');
?>

然后脚本继续为所选行中的每个单元格创建变量,然后在 HTML 代码中的适当位置回显这些变量。我的本地主机和网络服务器上的数据库是彼此的精确副本,所以这不是问题。我已尝试解决所有我能想到的问题,登录信息是正确的,因此与数据库的连接工作正常,但由于某种原因,当 运行 来自网络服务器时,脚本不会从数据库输出信息。但是它在本地主机上运行良好。

在此先感谢您的帮助。

我认为错误是 mysql_real_escape_string 的使用,事实上 PHP 文档报告说第二个参数 $link_identifier 需要一个有效的 link mysql_connect():

$link_identifier: The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If no connection is found or established, an E_WARNING level error is generated.

我认为您自己的服务器设置为不显示警告。

尝试在开始连接之前输入 error_reporting(E_ALL) 并查看是否真的收到警告。

如果你真的遇到错误,我认为最好使用语句来防止 SQL 以这种方式注入:

$query = "SELECT * FROM `Products` WHERE ID = ?";
$stmt = $mysqli->prepare($query);
if ($stmt === FALSE) {
    die("$mysqli->error");
}

$art = $_GET['art'];
$stmt->bind_param('i', $art);
$stmt->execute();
if ($stmt->errno != 0) {
    die("SQL Error: ({$stmt->errno}), {$stmt->error}");
}

$resultSet = $stmt->get_result();
$stmt->close();