Хорошо, поэтому мой вопрос заключается в том, что у меня есть функция, но я хочу разобрать его разные предложения WHERE, когда он выполняет запрос. например:
function query($where) { $query = $mysql->prepare("SELECT * FROM table WHERE ?"); $query->bind_param("s", $where); $query->execute(); ... } query("table.id=123 AND table.name='abc'");
Я узнал, что это неправильно. Так как я могу сделать что-то подобное, у меня есть много мест, где мне нужно использовать эту функцию с разными предложениями WHERE, и сделать функцию для каждого из них нецелесообразно и поэтому не выполняет функцию и не вызывает ее напрямую ,
Для подготовленного оператора с предложением WHERE вам нужно указать, какие значения будут указаны позже, например:
SELECT * FROM table WHERE ID=?
если вы хотите сделать его более динамичным, вы можете указать запрос в одной функции, а затем вызвать функцию запроса. Например, у вас есть следующее:
function query($query, $param, $where) { $query = $mysql->prepare($query); $query->bind_param($param, $where); $query->execute(); ... }
и в вашей другой функции вы говорите:
$results=query("SELECT * FROM table WHERE Id=?","s","1");
вы можете сделать это еще более сложным, создав класс запросов, который может содержать массив предложений where:
class query { public $query; public $param; public $where; } $query=new query(); $query->query="SELECT * FROM Table WHERE group=? AND name like ?"; $query->param="ss"; $query->where = array(); $query->where[]="administrators"; $query->where[]="sam";
и измените функцию запроса, чтобы она выглядела так:
function SQLCall(query $query) { $db = $mysql->prepare($query->query); call_user_func_array(array(&$db, 'bind_param'), $where) $db->execute(); ... }
Различные запросы в выражении if
(или если у вас есть много отклонений, switch
):
if($item === 'option1'){ $query = "SELECT * FROM table WHERE item = ?;"; $preparedQuery = $mysql->prepare($query); $preparedQuery->bind_param("s", $someString); } elseif($item === 'option2'){ $query = "SELECT * FROM table WHERE different = ?;"; $preparedQuery = $mysql->prepare($query); $preparedQuery->bind_param("i", $someInteger); } $preparedQuery ->execute();
Чрезмерно явно, но вы должны получить общую идею. Если вы знаете, что всегда будет одинаковое количество значений, и он всегда будет одного и того же типа, вы можете его упростить:
if($item === 'option1'){ $query = "SELECT * FROM table WHERE item = ?;"; } elseif($item === 'option2'){ $query = "SELECT * FROM table WHERE different = ?;"; } $preparedQuery = $mysql->prepare($query); $preparedQuery->bind_param("s", $someString); $preparedQuery->execute();