Я хотел бы защитить свои запросы в моем коде.
Сегодня мои текущие функции таковы.
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);
Есть идеи?
Честно говоря, вы не можете использовать подготовленные заявления таким образом. Есть правила, которым нужно следовать. Так что нет смысла писать что-то подобное
$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);
Других решений пока нет …