如何在 Zend Framework 数据库查询函数中实现准备好的语句

How to implement prepared statement in Zend Framework Database Query Functions

我正在学习 Zend 框架。现在我需要附加一个准备好的语句来防止 SQL 在 Zend Framework 中注入。 所以我在这里分享了一些我正在使用的函数,所以如果你能告诉我如何在这些 Zend 数据库查询函数中附加一个准备好的语句,那将会很有帮助。

public function getRowByID($id) {
        $row = $this->fetchRow("id =  '$id'");
        if (!$row) {
            return false;
        }
        return $row;
    }

public function getbyProjectID($projectid) {
        $query = "SELECT * FROM auth where projectid = '$projectid'";

        $result = $this->getAdapter()->query($query);
        return $result->fetchAll();
    }

public function updateRowByUserProject($username, $projectid) {

        $query = "UPDATE auth SET iscurrent=0 WHERE username = '$username'";

        $result = $this->getAdapter()->query($query);

        $query1 = "UPDATE auth SET iscurrent=1 WHERE username = '$username' AND projectid = '$projectid'";

        $result1 = $this->getAdapter()->query($query1);
        $affectedRow = $result1->rowCount();
        if($affectedRow == 1){
            return true;
        }else{
            return false;
        }
    }

对于获取,您可以使用 Zend_Db_Select Class 方法来准备和执行查询,在逗号(可能有多个问号)之后的问号位置(将从特殊字符转义的占位符)传递变量, 从左到右传递变量):

public function getRowByID($id) {
        $table = $this->getTable();
        $select = $table->select();

        $select->where('id = ?', $id);

        $row = $table->fetchRow($select);

        if (!$row) {
            return false;
        }
        return $row;
    }

对于你的第二种方法 getByProjectId() 这取决于你是在正确的模型中(比如 Auth_Model_Auth)还是你想从另一个 table

访问数据
public function getbyProjectID($projectid) {
    $table = $this->getTable();
    $select = $table->select();

    $select->where('projectid = ?', $projectid);

    $result = $table->fetchAll($select);
    return $result;
}

为了更新,您可以将数组传递给 'update' 方法,方法与获取数据的方式相同。数组的键必须是您的 table.

的列名
public function updateRowByUserProject($username, $projectid) {
    $table = $this->getTable();

    // Data you want to insert/update
    $data = [
        'iscurrent' => 0
    ];

    // Where you want to update it
    $where = [
        'username = ?' => $username
    ]

    $result = $table->update($data, $where);

    $data1 = [
        'iscurrent' => 1
    ]

    $where1 = [
        'username = ?' => $username,
        'projectid = ?' => $projectid
    ]

    $result1 = $table->update($data1, $where1);
}

编辑:

对于评论中的两个问题,您可以通过使用 quoteInto 方法来实现,该方法还可以从特殊字符中转义数据。

在第一种情况下,您准备一个 $where 变量,其中包含您要删除的记录:

$table = $this->getTable();
$where = $table->getAdapter()->quoteInto('projectid = ?', $projectid); 

$isDeleted = $table->delete($where);

在第二种情况下,您可以做完全相同的事情:

$query = "SELECT COUNT(*) AS total FROM applications WHERE projectid IN (SELECT projectid FROM auth WHERE projectid = ?)";
$query = $this->getAdapter()->quoteInto(?, $projectid):
...

但是你应该尽量避免在一个变量中编写大查询然后执行它们。我建议你去了解这个: https://framework.zend.com/manual/1.11/en/zend.db.select.html

很好地解释了如何为此目的使用 Zend 方法。