Как реализовать подготовленный оператор в функциях запроса к базе данных Zend Framework - PullRequest
0 голосов
/ 07 октября 2019

Я изучаю Zend Framework. Теперь мне нужно присоединить подготовленный оператор для предотвращения внедрения 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;
        }
    }

1 Ответ

1 голос
/ 08 октября 2019

Для извлечения вы можете использовать методы класса Zend_Db_Select для подготовки запроса и его выполнения, передавая переменные в местах вопросительных знаков (заполнители, которые будут экранированы от специальных символов) после запятой (возможно несколько вопросительных знаков, передавая переменные слева направо):

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) или хотите получить доступ к данным из другой таблицы

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

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

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

И для обновления вы можетепередать массив в метод 'update' в том же стиле, что и для извлечения данных. Ключ массива должен быть именем столбца вашей таблицы.

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, который также экранирует данные из специальныхchars.

В первом случае вы подготавливаете переменную $ 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 для этой цели.

...