"警告:mysql_query():提供的参数不是有效的MySQL-Link资源"

时间:2013-06-30 00:44:35

标签: php mysql database

我收到此错误:

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)或die(mysql_error());” 但我没有看到任何问题。

我尝试了什么:

  • 我在第二个连接上尝试使用和不使用“true”, 似乎没有任何区别。
  • 回应$ connection和$ gameDB_connection没有显示任何内容,
  • 在$ connection上使用var_dump显示“type(9)of type(mysql link)”
  • 从mysql_query中删除$连接,它连接到 其他DB(gameDB_connection)和我得到一个表的错误 不存在(它不在该DB上)。
  • 似乎在查询中添加/更改/删除反引号(`) 对错误没有影响
  • 变量$ gID echo正确,所以它不是null(它的1001 in 这个案例)
  • 如果我在实际的sql表单中运行SELECT部分​​(而不是通过php), 它正确地列出了它们
  • Connection.php在其他地方使用(一页读取 从两个数据库同时)成功。其他地方没有错误

任何人都知道出了什么问题?

1 个答案:

答案 0 :(得分:1)

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

两件事之一正在发生。之一:

  1. 您已经在其他地方加入了Connection.php,所以当您进入该功能时,它实际上并未包括在内......因为{{1}的曾经部分}。

    ...或

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

    < / LI>

    问题在于,当首次包含文件时(假设它来自此函数),require_once变量在函数范围内创建,并且像任何其他函数变量一样,在结束时消失了。功能。当您第二次调用该函数时,由于您正在使用$connection,因此不会发生包含。

    您可以通过调用require_once而不是require()来解决此问题,但每次调用该函数时最终都会重新连接到数据库 - 这会带来很多不必要的开销。只需将include移动到函数外部,并将连接传递给函数,或将其用作全局变量,就更清晰了。

    看起来像这样:

    require_once()

    所有这一切,这段代码存在两个主要问题。

    1. 您正在使用已弃用的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()); } 函数,很快将从新版本的PHP中删除。有关详细信息,请参阅此问题:Why shouldn't I use mysql_* functions in PHP?

      实际上切换到类似mysql_*函数的东西并不困难 - 有一组非对象的函数几乎与你现在使用的函数相同。

    2. 您在查询中包含一个变量而未正确转义它。至少你应该调用mysqli_*(或mysql_real_escape_string()),但更好的解决方案是查看准备好的语句。您可以在此处找到有关预准备陈述的更多信息:How can I prevent SQL injection in PHP?