0

我收到此错误:

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource

这是我的 Connection.php :

$userDB_server = "";
$userDB_user = "";
$userDB_password = "";
$userDB_database = "";
$connection = mysql_connect("$userDB_server","$userDB_user","$userDB_password") or die ("Unable to establish a DB connection");
$userDB = mysql_select_db("$userDB_database", $connection) or die ("Unable to establish a DB connection");


$gameDB_server = "";
$gameDB_user = "";
$gameDB_password = "";
$gameDB_database = "";
$gameDB_connection = mysql_connect("$gameDB_server","$gameDB_user","$gameDB_password", true) or die ("Unable to establish a DB connection");
$gameDB = mysql_select_db("$gameDB_database", $gameDB_connection) or die ("Unable to establish a DB connection");

这是我的功能:

require_once('Connection.php');
$findQuery = sprintf("SELECT * FROM `Keys` WHERE `ID` = '$gID'");
$findResult = mysql_query($findQuery, $connection) or die(mysql_error());
$resultRow = mysql_fetch_assoc($findResult) or die(mysql_error());

错误出现在“$findResult = mysql_query($findQuery, $connection) or die(mysql_error());” 但我在任何地方都看不到问题。

我试过的:

  • 我已经尝试过在第二个连接上使用和不使用“真实”,似乎在任何地方都没有什么不同。
  • 回显 $connection 和 $gameDB_connection 什么也没显示,
  • 在 $connection 上使用 var_dump 显示“resource(9) of type (mysql link)”
  • 从 mysql_query 中删除 $connection 让它连接到另一个数据库(gameDB_connection),我得到一个错误,表不存在(它不在那个数据库上)。
  • 从查询中添加/更改/删除反引号( ` )似乎对错误没有影响
  • 变量 $gID 回显正确,因此它不为空(在这种情况下为 1001)
  • 如果我以实际的 sql 表单(而不是通过 php)运行 SELECT 部分,它会正确列出它们
  • Connection.php 在其他地方使用成功(同时从两个数据库读取一页)。其他地方没有错误

有人知道出了什么问题吗?

4

1 回答 1

1

根据评论,听起来问题是require_once()在函数内部使用引起的。

两件事之一正在发生。任何一个:

  1. 您已经在Connection.php其他地方包含了,所以当您使用该功能时,它实际上并没有包含在内..require_once因为.

    或者...

  2. 第一次调用该函数时它正在工作,但第二次调用它时,该文件已被包含并且不会再次被包含。

问题是当文件第一次被包含时(假设它来自这个函数),$connection变量是在函数范围内创建的,并且像任何其他函数变量一样,在函数的末尾消失了。当您第二次调用该函数时,包含不会发生,因为您正在使用require_once.

您可能可以通过调用require()而不是来解决此问题require_once(),但这最终会在您每次调用该函数时重新连接到数据库 - 这是很多不必要的开销。将包含移到函数外部,然后将连接传递给函数,或者将其用作全局变量,这样会更干净。

看起来像这样:

require_once('Connection.php');

function getResult() {
    global $connection;

    $findQuery = "SELECT * FROM `Keys` WHERE `ID` = '$gID'";
    $findResult = mysql_query($findQuery, $connection) or die(mysql_error());
    $resultRow = mysql_fetch_assoc($findResult) or die(mysql_error());
} 

话虽如此,这段代码有两个主要问题。

  1. 您正在使用mysql_*已弃用的函数,这些函数很快就会从新版本的 PHP 中删除。有关更多详细信息,请参阅此问题:为什么我不应该在 PHP 中使用 mysql_* 函数?

    实际上,切换到mysqli_*函数之类的东西并不难——有一组非对象函数几乎与您现在使用的相同。

  2. 您在查询中包含一个变量而没有正确转义它。至少您应该调用mysql_real_escape_string()(或mysqli_real_escape_string()),但更好的解决方案是查看准备好的语句。您可以在此处找到有关准备好的语句的更多信息:如何防止 PHP 中的 SQL 注入?

于 2013-06-30T01:08:19.290 回答