Я использую этот код для отображения записи пользовательских данных, но этот код не работает на моей стороне
Я хочу выделить некоторые пользовательские данные. Я создал функцию, в которую я вставляю несколько аргументов (каждый аргумент представляет столбец в базе данных), а затем эхо, в зависимости от того, какой столбец я хочу с простой строкой кода.
Index.php
include('function.php');
$conn = new MySQLi(localhost, root, password, database);
$user_id = $_SESSION['login_user']; // like 1
$user = user_data($conn, $user_id, 'login', 'pass', 'nikename', 'email');
if(empty($user)){
echo 'error'; // always showing this error
}else{
echo $user['nickename'];
}
Всегда показывать
echo 'error';
function user_data($conn, $user_id){
$data = array();
$user_id = (int)$user_id;
$func_num_args = func_num_args();
$func_get_args = func_get_args();
if ($func_num_args > 1) {
unset($func_get_args[0]);
unset($func_get_args[1]);
$valid = array('login', 'pass', 'nikename', 'email');
$fields = array();
foreach($func_get_args as $arg) {
if(in_array($arg, $valid)) $fields[] = $arg;
}
$fields = ''' . implode ('', '', $fields) . ''';
if($stmt = $conn->prepare("SELECT $fields FROM 'users' WHERE 'user_id' = ?")) {
$stmt->bind_param('si', $fields, $user_id);
$stmt->execute();
//here I am trying to convert the result into an array
$meta = $stmt->result_metadata();
while ($field = $meta->fetch_field()) {
$parameters[] = &$row[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $parameters);
while ($stmt->fetch()) {
foreach($row as $key => $val) {
$x[$key] = $val;
}
$results[] = $x;
}
return $results;
$stmt->close();
}
}
}
Я полагаю, вместо
if($stmt = $conn->prepare("SELECT $fields FROM 'users' WHERE 'user_id' = ?")) {
$stmt->bind_param('si', $fields, $user_id);
вы должны пойти с
if($stmt = $conn->prepare("SELECT $fields FROM 'users' WHERE 'user_id' = ?")) {
$stmt->bind_param('i', $fields, $user_id);
Параметры привязки. Типы: s = строка, я = целое число, d = double, b = blob
Поскольку у вас есть один аргумент с типом INT, вам нужно передать "i" в качестве первых параметров.
Попробуйте отлаживать строку за строкой в этой функции, где вы получите точный недостаток var_dump().
Просматривая и анализируя свой код несколько раз, я думаю, что ниже будет решена ваша проблема.
Добавьте это до вашего цикла while/fetch
$row = array();
stmt_bind_assoc($stmt, $row);
поэтому ваш код будет выглядеть следующим образом:
$row = array();
stmt_bind_assoc($stmt, $row);
while ($stmt->fetch()) {
foreach($row as $key => $val) {
$x[$key] = $val;
}
$results[] = $x;
}
Также убедитесь, что вы прочитали полную документацию bind_param на php.net здесь
Спасибо и всего наилучшего
$stmt->bind_param('i', $user_id);
но код показывает тот же результат