Php PDO::exec()希望参数1是字符串,即使用准备好的语句时给定的对象

Php PDO::exec()希望参数1是字符串,即使用准备好的语句时给定的对象,php,sql,security,prepared-statement,Php,Sql,Security,Prepared Statement,我试图通过使用准备好的语句来防止SQL注入 以下代码显示了创建新用户时调用的函数。注释掉的代码确实有效,但不安全。因此,我尝试更改它,但出现以下错误: PDO::exec()要求参数1为字符串,对象为给定值 代码如下: function save() { if ($this->id === null) { $query = self::$app->db->prepare(self::INSERT_QUERY); $query->bi

我试图通过使用准备好的语句来防止SQL注入

以下代码显示了创建新用户时调用的函数。注释掉的代码确实有效,但不安全。因此,我尝试更改它,但出现以下错误:

PDO::exec()要求参数1为字符串,对象为给定值

代码如下:

function save()
{
    if ($this->id === null) {
        $query = self::$app->db->prepare(self::INSERT_QUERY);
        $query->bindParam(1, $this->username);
        $query->bindParam(2, $this->password);
        $query->bindParam(3, $this->email);
        $query->bindParam(4, $this->bio);
        $query->bindParam(5, $this->isAdmin);

        //$query = sprintf(self::INSERT_QUERY,
         //   $this->username,
         //   $this->password,
         //   $this->email,
         //   $this->bio,
         //   $this->isAdmin            );
    } else {
      $query = sprintf(self::UPDATE_QUERY,
            $this->username,
            $this->password,
            $this->email,
            $this->bio,
            $this->isAdmin,
            $this->id
        );
    }

    return self::$app->db->exec($query);
}
我对PHP和安全性都是新手,所以任何提示都将不胜感激

该方法返回一个对象(不是字符串值)。您需要使用该方法执行准备好的语句:

$query = self::$app->db->prepare(self::INSERT_QUERY);
$query->bindParam(1, $this->username);
$query->bindParam(2, $this->password);
$query->bindParam(3, $this->email);
$query->bindParam(4, $this->bio);
$query->bindParam(5, $this->isAdmin);
$query->execute(); //execute the prepared statement.
使用,您只能执行SQL语句(不带绑定参数)


您将准备好的语句和SQL语句混合在一起。您应该使用以下选项:

function save()
{
    if ($this->id === null) {
        $query = self::$app->db->prepare(self::INSERT_QUERY);
        $query->bindParam(1, $this->username);
        $query->bindParam(2, $this->password);
        $query->bindParam(3, $this->email);
        $query->bindParam(4, $this->bio);
        $query->bindParam(5, $this->isAdmin);
        return $query->execute();
    } else {
        $query = self::$app->db->prepare(self::UPDATE_QUERY);
        $query->bindParam(1, $this->username);
        $query->bindParam(2, $this->password);
        $query->bindParam(3, $this->email);
        $query->bindParam(4, $this->bio);
        $query->bindParam(5, $this->isAdmin);
        $query->bindParam(6, $this->id);
        return $query->execute();
    }
}
该方法返回一个对象(不是字符串值)。您需要使用该方法执行准备好的语句:

$query = self::$app->db->prepare(self::INSERT_QUERY);
$query->bindParam(1, $this->username);
$query->bindParam(2, $this->password);
$query->bindParam(3, $this->email);
$query->bindParam(4, $this->bio);
$query->bindParam(5, $this->isAdmin);
$query->execute(); //execute the prepared statement.
使用,您只能执行SQL语句(不带绑定参数)


您将准备好的语句和SQL语句混合在一起。您应该使用以下选项:

function save()
{
    if ($this->id === null) {
        $query = self::$app->db->prepare(self::INSERT_QUERY);
        $query->bindParam(1, $this->username);
        $query->bindParam(2, $this->password);
        $query->bindParam(3, $this->email);
        $query->bindParam(4, $this->bio);
        $query->bindParam(5, $this->isAdmin);
        return $query->execute();
    } else {
        $query = self::$app->db->prepare(self::UPDATE_QUERY);
        $query->bindParam(1, $this->username);
        $query->bindParam(2, $this->password);
        $query->bindParam(3, $this->email);
        $query->bindParam(4, $this->bio);
        $query->bindParam(5, $this->isAdmin);
        $query->bindParam(6, $this->id);
        return $query->execute();
    }
}

prepare()
返回一个语句对象,
exec()
需要一个语句字符串。您应该使用,which需要语句object执行哪个条件?
if
else
prepare()
返回一个语句对象,
exec()
需要一个语句字符串。您应该使用,which需要语句object执行哪个条件?
if
else
?非常感谢您的回复!不幸的是,这导致了另一个错误(我以前尝试过):“致命错误:在第70行调用/***/User.php中未定义的方法PDO::execute()”由于某种原因,execute()方法无法识别,似乎
var\u dump($query)
?嗨!再次感谢你,事实上,当我使用你的代码时,它确实起作用了。我现在遇到另一个错误:“常规错误:25绑定或列索引超出范围”,在第一行“return$query->execute();”中,您可以显示查询(
INSERT\u query
UPDATE\u query
)吗?看起来您试图绑定更多可用参数。哦,错误在其他地方:)我使用了%s而不是?在INSERT_查询中。谢谢你的耐心!你真棒!非常感谢您的回复!不幸的是,这导致了另一个错误(我以前尝试过):“致命错误:在第70行调用/***/User.php中未定义的方法PDO::execute()”由于某种原因,execute()方法无法识别,似乎
var\u dump($query)
?嗨!再次感谢你,事实上,当我使用你的代码时,它确实起作用了。我现在遇到另一个错误:“常规错误:25绑定或列索引超出范围”,在第一行“return$query->execute();”中,您可以显示查询(
INSERT\u query
UPDATE\u query
)吗?看起来您试图绑定更多可用参数。哦,错误在其他地方:)我使用了%s而不是?在INSERT_查询中。谢谢你的耐心!你真棒!