У меня есть класс БД, который занимается все запросы будут сделаны к базе данных
У меня есть mysqli подготовить работать нормально.
bind_param также работает нормально, но проблема в том, что я хочу определить тип переменной динамически.
вот мой код
public function query($sql, $params = array()){
$this->_error = false;
if($this->_query = $this->_mysqli->prepare($sql)){
$x = 1;
if(count($params)){
foreach($params as $param){
$this->_query->bind_param($x, $param);
$x++;
}
}
В PDO параметр fist определяет позицию, которую я предполагаю, поэтому эта функция работает нормально, устанавливая X = 1 и x ++ каждый раз,
но в bind_param
первый аргумент определяет тип я думаю
как говорится в руководстве php.net
так что есть ли способ, если пользователь нажимает целое значение, которое я установил
х = я
для строки
х = с
и так далее и тому подобное для всех 4 типов …
лайк
if((int)$param->){
x = i;
}
Любая идея, ребята?
заранее спасибо
Вот пример, который может помочь ( prepare()
функция является методом класса).
function prepare( $query, $bind = array() )
{
if ( !$stmt = $this->mysqli->prepare( $query ) )
throw new Exception( 'Query failed: ' . $query . PHP_EOL . $this->mysqli->error );
// if $bind is not an empty array shift the type element off the beginning and call stmt->bind_param() with variables to bind passed as reference
if ( $type = array_shift( $bind ) )
call_user_func_array(
array( $stmt, 'bind_param' ),
array_merge( array( $type ), array_map( function( &$item ) { return $item; }, $bind ) )
);
if ( !$stmt->execute() )
throw new Exception( 'Execute failed: ' . PHP_EOL . $stmt->error );
// choose what to return here ( 'affected_rows', 'insert_id', 'mysqli_result', 'stmt', 'array' )
}
Пример использования:
$db->prepare( "SELECT * FROM user WHERE user_name = ? OR user_email = ?", [ 'ss', $user_name, $user_name ] );
Для типов это легко. Просто используйте s
все вокруг.
Существует гораздо более сложная проблема: на самом деле, вы не можете связать в цикле, поэтому нужно использовать call_user_func()
public function query($sql, $params = array())
{
if (!$params)
{
return $this->_mysqli->query($sql);
}
$stmt = $this->_mysqli->prepare($sql);
$types = str_repeat("s", count($params));
if (strnatcmp(phpversion(),'5.3') >= 0)
{
$bind = array();
foreach($values as $key => $val)
{
$bind[$key] = &$params[$key];
}
} else {
$bind = $values;
}
array_unshift($bind, $types);
call_user_func_array(array($stmt, 'bind_param'), $bind);
$stmt->execute();
return $stmt->get_result();
}
Обратите внимание, что вы не должны присваивать оператор локальной переменной, и для переменной error также нет смысла. Исключения лучше во всех отношениях.
Глядя на приведенный выше код, вы должны дважды подумать, прежде чем переворачивать PDO, что займет всего три строки для такой функции:
public function query($sql, $params = array())
{
$stmt = $this->_pdo->prepare($sql);
$stmt->execute($params);
return $stmt;
}
Если у вас нет опыта работы с PDO, вот Учебник по PDO Я написал, из которого вы узнаете, что это самый простой, но мощный API баз данных, который предоставляет вам данные в десятках различных форматов с очень небольшим количеством кода.