Используйте PDO exec(array()) с несколькими операндами

Я хотел бы защитить свои запросы в моем коде.

Сегодня мои текущие функции таковы.

public function UpdatePMS($table,$data,$where) {
    $ret        = array();
    $set_data   = "";
    foreach($data as $key => $value){
        $set_data .= $key."= '".$value."', ";
    }

    if (isset($where))      {
        $where = "WHERE ".$where;
    }

    $sql        = "UPDATE ".$table." SET ".$set_data."".$where;
    $sql        = str_replace(", WHERE", " WHERE", $sql);
    $stm        = $this->db->prepare($sql);
    $ret        = $stm->execute();
    return $ret;
}

Таким образом, я могу выбрать любые таблицы, любые данные и любые условия. Например:

WHERE id = 1 and status < 10

Или только

WHERE id = 10 

Или иногда

WHERE id = 1 and status >= 5

Содержание где может измениться. Этакий универсальный запрос. То же самое для удаления, обновления, выбора, вставки.

Я пытался сделать так, но это не работает.

$db     = new PDO('mysql:host=localhost;dbname=asterisk','root','');
$table = "my_table";
$where = "WHERE id = 1";
$sql    = 'SELECT * FROM :table :where';
$stm    = $db->prepare($sql);
$stm->execute(array(":table" => $table, ":where" => $where));
$ret    = $stm->fetchall(PDO::FETCH_ASSOC);

Есть идеи?

1 ответ

Решение

Честно говоря, вы не можете использовать подготовленные заявления таким образом. Есть правила, которым нужно следовать. Так что просто нет смысла писать что-то подобное

$table = "my_table";
$where = "WHERE id = 1";
$sql    = 'SELECT * FROM :table :where';
$stm    = $db->prepare($sql);
$stm->execute(array(":table" => $table, ":where" => $where));

вместо этого вы должны написать этот код

$sql = 'SELECT * FROM my_table WHERE id = ?';
$stm = $db->prepare($sql);
$stm->execute(array($id));

Кроме того, вы не можете параметризовать имена таблиц и полей, поэтому лучше писать их как есть.

так что мне нужно сделать одну функцию для разных запросов, верно?

Честно говоря - да. Это избавит вас от МНОГО головных болей.

public function UpdatePMS($data, $id)
{
    $data[] = $id;
    $sql = "UPDATE table SET f1 = ?, f2 = ? WHERE id = ?";
    $stm = $this->db->prepare($sql);
    $ret = $stm->execute($data);
    return $ret;
}

который будет использоваться как

$obj->UpdatePMS([$f1, $f2], $id);
Другие вопросы по тегам