如何在 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 方法。
我正在学习 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 方法。