【问题标题】:Failed To Call Member Function Query On A Non-object, MySQLI对非对象调用成员函数查询失败,MySQLI
【发布时间】:2013-01-11 01:04:12
【问题描述】:

我在使用 MySQLI 代码生成寄存器时遇到问题。表/连接变量匹配,并且通过查询传递的正确变量填充了预期的字符串,当运行 queryprepare & execute 执行任何类型的查询时,我得到以下返回:

致命错误:在非对象上调用成员函数 query() /var/www/New/API/FormValidations.php 第 40 行

我的代码如下:

$Query = $STD->prepare("SELECT * FROM Users WHERE Username='$Username'");
$Query->execute();
$Number = $Query->num_rows;
if ($Number !== 0)
{
    echo "Username Already In Use";
}
else
{
$Insert_User = $STD->prepare("INSERT INTO Users ('Username', 'Password') VALUES ('$Username', '$Password)");
$Insert_User->execute();
echo "Account Created!";
}

这是我的连接脚本:

$STD = new mysqli('localhost', 'root', 'xxxxx', 'SLMS');
$AccessCon = new mysqli('localhost', 'root', 'xxxxx', 'DBAccess');

if ($AccessCon->connect_error) {
    die("Access Has Been Revoked. Please Contact Administration");
}

if ($STD->connect_error) {
    die("Standard Access Has Been Revoked. Please Contact Administration"); 
}

还有我的用户 SQL 表:

CREATE TABLE IF NOT EXISTS `Users` (
  `ID` int(255) NOT NULL AUTO_INCREMENT,
  `Username` varchar(255) NOT NULL,
  `Password` text NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

我已经尝试注释掉我所有的查询代码,并运行

$Query = $STD->query("SHOW TABLES"); $Results = $STD->fetch_array(MYSQLI_ASSOC);

这仍然在我的 $Query 变量上返回错误。

我还尝试修改我的代码以搜索数据库中已经存在的内容:

$Query = $STD->prepare("SELECT * FROM Users WHERE Username='Test'");

并试图附上我的$Username如下:

$Query = $STD->prepare("SELECT * FROM Users WHERE Username='{$Username}'");

这没有成功。我想知道是否有人可以阐明这种情况?

编辑:

注释掉整个脚本并运行:

$Query = $STD->query("SHOW TABLES");
$test = $Query->fetch_array(MYSQLI_ASSOC);
print_r($test);

返回一个结果。

更新:

我已将代码修改为:

$Query = $STD->prepare("SELECT * FROM Users WHERE Username=?");
                $Query->bind_param("s", $Username);
                $Query->execute();

最终更新:

致命错误:在非对象上调用成员函数 bind_param() 在 /var/www/New/Register.php 第 45 行

这是新的错误。

违规行:

            $Insert_User = $STD->prepare("INSERT INTO Users ('Username', 'Password') VALUES (?, ?)");
                $Insert_User->bind_param("ss", $Username, $Password);
            $Insert_User->execute();

【问题讨论】:

  • 什么是 dd 在您上次编辑中替换为 ss
  • @ROYFinley 我已经做到了。问题仍然存在,但看起来一切正常

标签: php mysqli


【解决方案1】:

使用 prepare 时,您必须绑定保存您的值的变量。

例子:

 $city = "Amersfoort";

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $stmt->close();
}

这里是prepared statements的链接

更新

这个:

$Query = $STD->prepare("SELECT * FROM Users WHERE Username=s");

应该是:

$Query = $STD->prepare("SELECT * FROM Users WHERE Username=?");

这个:

$Insert_User = $STD->prepare("INSERT INTO Users ('Username', 'Password') VALUES ('U', 'P)");

应该是:

$Insert_User = $STD->prepare("INSERT INTO Users ('Username', 'Password') VALUES (?, ?)");

这个:

$Insert_User->bind_param('U', $Username);
$Insert_User->bind_param('P', $Password);

应该是这样的:

$Insert_User->bind_param('ss', $Username,$Password);

【讨论】:

  • 这并不能解释为什么,当我使用$STD->query 时它会返回错误?
  • 这个$Results = $STD->fetch_array(MYSQLI_ASSOC);应该是这个$Results = $Query->fetch_array(MYSQLI_ASSOC);
  • 这不是我的问题,这是我试图找到我的问题的一个步骤。实际问题出在:$Query = $STD->prepare("SELECT * FROM Users WHERE Username='$Username'");
  • 你问过 这没有解释为什么,当我使用 $STD->query 时它会返回错误? 我回答说,我知道这不是你脚本的一部分。使用我上面的示例并重新格式化您的代码。
  • 我已经使用了你所说的绑定。然而它并没有摆脱我的错误。
猜你喜欢
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2014-05-28
  • 2013-09-26
  • 1970-01-01
  • 2013-01-16
  • 2015-10-14
  • 1970-01-01
相关资源
最近更新 更多