Используйте 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);

Есть идеи?

0

Решение

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

$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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]