Запрос в mysql (select) для выборки данных с bind_param
Я делаю метод который будет осуществлять выборку из БД mysql, который подготавливает запрос, чтобы избежать взлома БД.
У меня получилось сделать такой метод, но, по моему, он не очень гибок, в плане того что я не могу с помощью него сделать select с типа ... AND id = 1 AND (r1 = 1 OR r2 = 3)
Сейчас с помощью этого метода я могу делать только запросы такого типа ... AND id = 1 AND r1 = 1 AND ....
Вот так я вызываю метод:
$user = $this->db->select(
'users',
[
[
'row' => 'auth_token',
'value' => $claims['auth_token'],
'sep' => 'AND'
],
[
'row' => 'email',
'value' => $claims['email']
]
],
['id']
);
А вот сам метод:
public function select($table, $where = [], $rows = ['*'], $order = '', $limit = '', $offset = '') {
$get_types = ''; $get_values = [];
$for_where = [];
$rows = implode(',', $rows);
$next_index = 0;
if ( count($where) > 0 ) {
foreach ($where as $row => $value) {
$next_index++;
$type = gettype($value['value']);
if ($type == 'integer') {
$_p = 'i';
}else if ($type == 'double') {
$_p = 'd';
}else{
$_p = 's';
}
$get_types .= $_p;
$for_where[] = trim($value['row'].' = ? '.( ( isset($value['sep']) && isset($where[ $next_index ]) ) ? $value['sep'] : '' ));
$get_values[] = $value['value'];
}
}
if ( count($for_where) > 0 ) {
$sql = "SELECT ".$rows." FROM `$table` WHERE ".implode(' ', $for_where)." ".$order." ".$limit." ".$offset;
}else{
$sql = "SELECT ".$rows." FROM `$table` ".$order." ".$limit." ".$offset;
}
$sql = trim($sql);
$stmt = $this->mysqli->prepare($sql);
if ( count($get_values) > 0 ) {
$stmt->bind_param($get_types, ...$get_values);
}
$stmt->execute();
$result = $stmt->get_result();
$result_data = $result->fetch_all(MYSQLI_ASSOC);
$result_amt = count($result_data);
$result->close();
$stmt->close();
return [ 'data' => $result_data, 'amt' => $result_amt];
}
Буду благодарен за помощь, хотелось бы по возможности оптимизировать этот код, и сделать метод более гибким!
Источник: Stack Overflow на русском