Я пытаюсь создать динамическую функцию для выполнения запросов MySQL.
Вот как пример обычного запроса:
public function myfunc() {
$name = "ryan";
$stmt = $this->db->prepare("SELECT name, age, id FROM users WHERE name = ?");
$stmt->bind_param( "s", $name );
$stmt->execute();
$stmt->bind_result( $name2, $age, $id );
while( $stmt->fetch() )
$users[] = array( 'name' => $name2, 'age' => $age, 'id' => $id );
$stmt->close();
return $users;
}
Я пытаюсь сделать что-то вроде:
public function query( $myquery, $params, $types, $returns ) {
$stmt = $this->db->prepare( $myquery );
$stmt->bind_param( $types, $params );
$stmt->execute();
$stmt->bind_result( $returns_array );
$i = 0;
while( $stmt->fetch() ) {
$users[] = array( $returns[$i] => $returns_array[$i++], .... );
}
$stmt->close();
return $users;
}
Где я мог бы динамически использовать подготовленные операторы в простой в использовании функции ..
пример вызова этого:
$users = query( "SELECT name, age, id FROM users WHERE name = ?", array('ryan'), "s", array('name','age','id'));
Тогда вы можете легко вызвать данные через:
$users[0]['name']..
$users[0]['age']..
$users[0]['id']..
Я немного запутался в том, как бы это сделать, но есть ли у вас, ребята, какие-нибудь идеи или места, которые я мог бы начать? Код был бы особенно полезен.
Я также нашел эту статью: http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli
Но я не хочу, чтобы это было слишком конкретным для программного обеспечения, установленного в ОС.
Обновление № 2
Мне нужно вернуть ключ -> значение массива из нескольких массивов. Я придумал это, но не могу этого достичь. Я получаю значения идентификатора, а не то, что я просил.
public function query( $query_string, $params = null, $param_types = null) {
//prepare the statement
$stmt = $this->db->prepare($query_string);
//check if the sql query is wrong.
if($stmt === false) {
echo "Wrong SQL: " . $query_string . "<br />Error: " . $this->db->errno . " " . $this->db->error;
}
if($params != null && $param_types != null) {
//build the array that needs to pass the args to bind_param.
$a_params = array();
$a_params[] = &$param_types;
for($i=0; $i<count($params); $i++)
$a_params[] = &$params[$i];
// $stmt->bind_param('s', $param); equivalent
call_user_func_array(array($stmt, 'bind_param'), $a_params);
}
//run the query
$stmt->execute();
//gather column names
$metadata = $stmt->result_metadata();
$field_names = array();
$fields = array();
$results = array();
$i = 0;
// This is the tricky bit dynamically creating an array of variables to use
// to bind the results
while( $field = $metadata->fetch_field() ) {
//for binding the results
$var = $field->name;
$null_v = null;
$fields[$var] = &$null_v;
//for storing the field names
$field_names[$i] = $var;
$i++;
}
// Bind Results
call_user_func_array(array($stmt,'bind_result'),$fields);
//put results into an array
$i = 0;
while ($stmt->fetch()) {
for( $k = 0; $k < count($fields); $k++){
$results[$i][$field_names[$k]] = $fields[$field_names[$k]];
}
$i++;
}
$stmt->close();
return $results;
}
И как я звоню и получаю данные.
$users = $TCS->query("SELECT name, age, id FROM test");
foreach($users as $user) {
echo $user['name'];
}
но он выводит их идентификаторы. (1, 2, 3) где следует выводить их имена (Райан, Стивен и Джон)
Задача ещё не решена.
Других решений пока нет …