【问题标题】:Why do I get "mysql_query(): supplied argument is not a valid"为什么我会得到“mysql_query():提供的参数无效”
【发布时间】:2010-03-09 01:44:40
【问题描述】:

为什么我得到一个“mysql_query():提供的参数无效”对于第一个...

$r = mysql_query($q, $connection);

在下面的代码中...

$bId    = trim($_POST['bId']);
$title  = trim($_POST['title']);
$story  = trim($_POST['story']);

$q  = "SELECT * ";
$q .= "FROM " . DB_NAME . ".`blog` ";
$q .= "WHERE `blog`.`id` = {$bId}";
$r = mysql_query($q, $connection);
//confirm_query($r);
if (mysql_num_rows($r) == 1) {      
    $q  = "UPDATE " . DB_NAME . ".`blog` SET
                        `title` = '{$title}',
                        `story` = '{$story}'
                    WHERE `id` = {$bId}";
    $r = mysql_query($q, $connection);
    if (mysql_affected_rows() == 1) {
        //Successful
        $data['success'] = true;
        $date['errors']  = false;
        $date['message'] = "You are the Greatest!";
    } else {
        //Fail
        $data['success'] = false;
        $data['error']   = true;
        $date['message'] = "You can't do it fool!";
    }        
}

我也收到“mysql_num_rows():提供的参数不是有效的 MySQL 结果资源”错误。

旁注:我正在使用 1&1 托管(有史以来最差的托管)、带有一行文本的自定义 .htaccess 文件来启用 PHP 5.2(只有 1&1 托管的方式)。


问题发布后添加额外内容...

这是 $connection 的定义方式。它位于自己的名为 connection.php 的页面上,该页面使用 require_once 函数调用。它在需要数据库连接的每个页面上都被调用,包括有问题的页面......

$connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
    if (!$connection) {
        die("Database Connection Failed: </br>" . mysql_error());
    }
    $db_select = mysql_select_db(DB_NAME,$connection);
    if (!$db_select) {
        die("Database Selection Failed: </br>" . mysql_error());
    }

...我知道它正在工作,因为这与我用于我拥有的页面的连接相同,而且我没有任何问题。我还没有在我的家庭服务器上进行测试,但我稍后会看看它是否与 1&1 Hosting 问题有关。

更新:我正在从 1&1 Hosting 转移到 HostMoster。 1&1 将 PHP 作为 CGI 运行并运行 PHP4 而不是 PHP5(您可以制作自定义 .htaccess 文件以使其运行 PHP5)。稍后我会更新你。

【问题讨论】:

  • 看起来 sql-injection 易受攻击。使用 mysql_real_escape_string() 转义参数或使用参数化查询。
  • 我做了...你在这里看不到它,因为我从这里删除了它,以便我可以让它简单地阅读。我有一个自动检查“mysql_real_escape_string”是否有效的函数。如果它有效,那么它将检查“get_magic_quotes_gpc”是否处于活动状态。如果是这样,那么它将去除斜线并使用“get_magic_quotes_gpc”。如果没有,那么它将只使用“get_magic_quotes_gpc”。最后,如果 get_magic_quotes_gpc 和 $magic_quotes_active 无效或启用,那么它只会添加斜杠。我从 Lynda.com 上一些视频的作者 Kevin Shoglund 那里得到了这个功能。

标签: php


【解决方案1】:

第一个是因为它不是连接,第二个是因为它不是查询结果,因为它不是一个连接。使用mysql_error() 找出连接中的问题。

【讨论】:

  • 您可能是对的,因为我的其他一些用户定义函数也不起作用。我在发布代码之前剥离了它们。使用 jQuery AJAX 时,您可以使用 require_once() 函数连接另一个页面,例如 functions.php 吗?意思是......一个页面将通过ajax发布到另一个页面,这需要4个具有预定义功能的其他页面,并且该页面将返回数据。
  • AJAX 只是向 Web 服务器发起另一个请求。它与浏览器的正常点击并没有太大区别。
  • 如果是这种情况,那么我已经定义了 var $connection。这与我在所有页面中使用的帐户相同。在我的问题中,我添加了定义 $connection 的代码。
  • 您创建 $connection 失败。找出原因。
  • 看上面我贴的代码。我没有数据库错误。
【解决方案2】:

我的猜测是$connection 没有正确打开。你应该有这样的一行:

$connection = mysql_error($server, $user, $pass);

同时检查 mysql_error() 以了解失败的原因。

【讨论】:

    【解决方案3】:

    我认为 cletus 的意思是建议您在尝试执行 mysql_query() 之前需要使用 mysql_connect() 而不是 mysql_error()。它可能看起来像这样(除了 1and1 可能给你一个特定的主机名来连接你的数据库,你应该使用它来代替下面的localhost):

    //Make sure this goes before any of your other mysql_* functions
    $connection = mysql_connect('localhost', 'yourUserName', 'yourPassword');
    

    实际上没有必要为每个查询传递$connection,除非您同时打开了多个正在使用的数据库连接,并且需要确保在进行查询调用时区分这两者。否则,mysql_query 假定您正在使用您连接的最后一个数据库。

    此外,出于 Frank 提到的安全目的,您应该像这样使用 mysql_real_escape_string()

    $q  = "SELECT * ";
    $q .= "FROM " . DB_NAME . ".`blog` ";
    $q .= "WHERE `blog`.`id` = ".mysql_real_escape_string($bId).";
    

    【讨论】:

    • 我已经用$connection var 更新了我的代码。另请查看对弗兰克评论的回复。我确实转义了我的代码,只是我在此处发布时删除了对该函数的调用。
    • 在运行查询之前尝试使用var_dump($q, $connection);。这应该向您展示您传递给 mysql_query() 的每个变量实际上是什么。
    【解决方案4】:

    在我的本地系统上测试(通过 WAMP),我没有问题。当我遇到问题时,我正在使用 1&1 Hosting。 1&1 Hosting 将 PHP 作为 CGI 运行,这可能会导致我的问题。我无法用 1&1 处理所有的废话并切换到 HostMonster。现在,我没有任何问题。另外,我宁愿使用 cPanel 而不是 1&1 的管理面板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2011-10-08
      • 2019-01-06
      • 1970-01-01
      相关资源
      最近更新 更多