一尘不染

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

mysql

我收到此错误:

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显示“ resource(9)类型(mysql链接)”
  • 从mysql_query删除$ connection使其连接到另一个数据库(gameDB_connection),并且我得到一个错误,指出该表不存在(该表不在该DB上)。
  • 从查询中添加/更改/删除反引号(`)似乎对错误没有影响
  • 变量$ gID echo正确,因此不为null(在这种情况下为1001)
  • 如果我以实际的sql形式(而不是通过php)运行SELECT部分​​,它将正确列出所有这些内容
  • Connection.php在其他位置成功使用(一页同时从两个数据库读取)。其他任何地方都没有错误

有人知道怎么了吗?


阅读 375

收藏
2020-05-17

共1个答案

一尘不染

根据注释,听起来问题似乎是由于require_once()在函数内部使用引起的。

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

  1. 你已经包括Connection.php在其他地方,所以当你的功能,它实际上并不包括在内,因为在中.. 曾经 的一部分require_once

要么…

  1. 工作的第一次调用的功能,但你把它叫做第二次,该文件已经被包括在内,不会再次包括在内。

问题在于,当第一次包含该文件时(假定是从该函数中来的),该$connection变量在函数作用域中创建,并且像其他任何函数变量一样,在该函数的末尾消失了。当您第二次调用该函数时,包含不会发生,因为您正在使用require_once

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

看起来像这样:

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_*函数之类的东西实际上并不难-有一组非对象的函数与您现在所使用的几乎相同。

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