【问题标题】:"Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource"“警告:mysql_query():提供的参数不是有效的 MySQL-Link 资源”
【发布时间】:2013-06-27 11:39:46
【问题描述】:

我收到此错误:

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());” 但我在任何地方都看不到问题。

我的尝试:

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

有人知道怎么回事吗?

【问题讨论】:

  • Please, don't use mysql_* functions for new code. 它们不再被维护并被正式弃用。看到 red box 了吗?您可以改用PDOMySQLi - this article 可以帮助您决定使用哪个。
  • 这真的是您的Connection.php 和测试文件的全部内容吗?您能在此处显示的行重现问题吗?
  • 另外,这与您的问题无关 - 但没有理由使用像 "$gameDB_server" 这样的值 - 您可以只使用变量本身而不用引号括起来:$gameDB_server
  • 那是 Connection.php 的 100%(除了它之前和之后的 ),那是函数的 100%。它被调用并传递了变量 $gID (似乎成功传递,因为它正确回显)。哦,我正在使用 PHP 版本 5.2.17 以防万一
  • 当你说函数..你的意思是你正在调用的文字函数吗? $connection 是一个全局变量,除非你在函数中使用global $connection,否则它在函数中不可用。

标签: php mysql database


【解决方案1】:

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

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

  1. 你已经在其他地方包含了Connection.php,所以当你进入这个函数时,它实际上并没有被包含..因为require_onceonce部分。

    或者...

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

问题是当文件第一次被包含时(假设它来自这个函数),$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 中删除。有关详细信息,请参阅此问题:Why shouldn't I use mysql_* functions in PHP?

    实际上,改用 mysqli_* 之类的函数并不难 - 有一组与您现在使用的几乎相同的非对象函数。

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

【讨论】:

  • 好吧,所以使用新布局(require_once 在顶部,全局 $connection IN 函数)它没有任何错误,但函数停止在:$resultRow = mysql_fetch_assoc($findResult) or die(mysql_error()); 任何低于此的事情都不会发生,但没有错误。啊! (即使我把echo mysql_error() 放在它上面)编辑:将require_once 更改为require 无效
  • 修复了!我仍在使用 gID 1001(它是从列表中选择的),但表中只有 1014 的值。我想我需要在其中添加一个计数器,是吗?哈哈。谢谢大佬!
  • @CrackedPixel 您可以使用mysql_num_rows() 查看是否实际返回了任何结果 - 因此如果您使用错误的 ID,它不会死。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多