使用bind_参数时是否可以获取_对象?(PHP/MySQLi)

使用bind_参数时是否可以获取_对象?(PHP/MySQLi),php,mysqli,Php,Mysqli,我有个问题要问你们。我正在努力使我运行MySQL的方式尽可能安全。我目前想知道,在我准备好语句、绑定参数并执行语句之后,是否可以使用MySQLi获取对象 例如: $sql = $mysqli->prepare('SELECT * FROM users WHERE username = ?;'); $sql->bind_param('s', $username); $username = 'RastaLulz'; $sql->execute(); $object = $sql

我有个问题要问你们。我正在努力使我运行MySQL的方式尽可能安全。我目前想知道,在我准备好语句、绑定参数并执行语句之后,是否可以使用MySQLi获取对象

例如:

$sql = $mysqli->prepare('SELECT * FROM users WHERE username = ?;');
$sql->bind_param('s', $username);

$username = 'RastaLulz';

$sql->execute();
$object = $sql->fetch_object();
echo $object->mail;
我得到以下错误:

Fatal error: Call to a member function fetch_object() on a non-object in C:\xampp\htdocs\ProCMS\DevBestCMS\inc\global\class.mysql.php on line 23
但是,当我添加“$sql->result_metadata();”时,我没有得到错误,但它不会返回结果(它只是NULL)

在不绑定参数的情况下,您可以这样做:

$sql = $mysqli->query("SELECT * FROM users WHERE username = 'RastaLulz';");
$object = $sql->fetch_object();
echo $object->mail;
这是我当前的MySQL类-只需要让execute函数工作。


任何帮助都将被感激

什么是“;”在你陈述的最后?您给mysqli的查询无效,因此它没有为您创建对象。 问题不在于fetch_对象,而在于prepare语句。 删除“;”然后再试一次。它应该像一个符咒


我从来没有看到过这样的查询结果。 尝试在绑定之前实例化变量。
我认为这只是一个很好的做法,但使用双引号而不是单引号

我只是在我的数据库课上翻了翻,我就是这样做的。老实说,我不记得为什么我需要这样做,也许有更好的方法。但如果这对你有帮助,这里是代码。我确实隐约记得,我对没有一个简单的方法来获得你作为一个对象的结果感到恼火


// returns an array of objects
public function stmtFetchObject(){

    $rows=array(); //init

    // bind results to named array
    $meta = $this->stmt->result_metadata();
    $fields = $meta->fetch_fields();

    foreach($fields as $field) {
            $result[$field->name] = "";
            $resultArray[$field->name] = &$result[$field->name];
    }

    call_user_func_array(array($this->stmt, 'bind_result'), $resultArray);

    // create object of results and array of objects
    while($this->stmt->fetch()) {
            $resultObject = new stdClass();

            foreach ($resultArray as $key => $value) {
                $resultObject->$key = $value;
            }

            $rows[] = $resultObject;
    }

    return $rows;
}

我也有同样的问题。我发现我可以做到以下几点:

# prepare statement
$stmt = $conn->prepare($sql)

# bind params
$stmt->bind_param("s", $param);

# execute query
$stmt->execute();

# get result
$result = $stmt->get_result();

# fetch object
$object = $result->fetch_object();

我希望这也适用于您。

绑定之前,
$username
中有什么内容
bind_param
通过引用工作,并且很可能您没有有效地向绑定传递任何内容,除非
$username
已经包含一个值(即使它是错误的值)。这就是SQL查询的结束。我删除了它,同样的问题也出现了。MySQL查询的末尾需要一个分号。当从php调用它们时,可以忽略它们,但至少它们不会造成任何伤害。如果您尝试从sql控制台执行查询而不使用结束分号,则不会发生任何事情,因为它知道如何知道您已到达查询的结尾。是的,我知道。但是对于php查询,我知道不应该使用它们。声明“查询字符串不应以分号结尾。”要添加get_result()仅在>=5中可用。3get_result()需要加载mysqlnd驱动程序。正如@Jeremiah所说,它应该可以在>=5.3中安装,默认情况下可以在>=5.4中安装,但我发现它不可用,因此您的里程可能会有所不同。我将在几年后验证是否缺少mysqlnd(php构建中mysqli扩展的mysql本机驱动程序-请参阅phpinfo->Configure命令)在流行的主机中仍然存在到今天,这同样令人失望。谢谢,在我发现我的生产服务器仍然在5.3上并且get_results()不可用时实现了这一点。注意:此函数返回一个对象数组。因此,如果有一个结果,则返回$rows[0]以传回实际对象我很高兴这有帮助。我添加了一条注释来说明返回类型。
# prepare statement
$stmt = $conn->prepare($sql)

# bind params
$stmt->bind_param("s", $param);

# execute query
$stmt->execute();

# get result
$result = $stmt->get_result();

# fetch object
$object = $result->fetch_object();