fetch()
не возвращает результаты. Там нет полезной информации, возвращаемой этой функцией. Что вам нужно сделать, это получить результат mysqli. Есть 2 способа сделать это.
Более простой способ:
$stmt = $conn->prepare("SELECT username FROM usersinfo WHERE id = ?");
$stmt->bind_param("s", $uid);
$stmt->execute();
$result = $stmt->get_result(); // Get the result of the above statement.
$firstRow = $result->fetch_array(); // Get the first result into an array
if ($firstRow) {
echo $firstRow[0];
//or
echo $firstRow['username'];
}
Здесь мы получаем объект результата mysqli, а затем запрашиваем одну строку.
Другой способ использования bind_result()
:
$stmt = $conn->prepare("SELECT username FROM usersinfo WHERE id = ?");
$stmt->bind_param("s", $uid);
$stmt->execute();
$stmt->bind_result($username); // Bind a single column from SELECT to a single variable
$stmt->fetch(); // Fetch the first row. It will populate the variable
echo $username;
На мой взгляд, это труднее читать. Также, если вы хотите получить больше столбцов, это очень быстро станет очень сложно.
Если честно, mysqli не очень дружелюбен и очень громоздок в использовании. Я настоятельно рекомендую переключиться на PDO, но если вы не можете попытаться инкапсулировать функции mysqli в некоторый класс или функцию. В YCS есть пример такой вспомогательной функции . Недавно я написал пример того, как расширить класс mysqli с помощью класса-оболочки.
Я добавил простой метод в класс mysqli и посмотрю, как упрощены операторы.
class DBClass extends mysqli {
public function __construct(
$host = null,
$username = null,
$passwd = null,
$dbname = null,
$port = null,
$socket = null
) {
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
parent::__construct($host, $username, $passwd, $dbname, $port, $socket);
$this->set_charset('utf8mb4');
}
public function safeQuery(string $sql, array $params = []): ?array {
$stmt = $this->prepare($sql);
if ($params) {
$stmt->bind_param(str_repeat("s", count($params)), ...$params);
}
$stmt->execute();
if ($result = $stmt->get_result()) {
return $result->fetch_all(MYSQLI_BOTH);
}
return null;
}
}
Пример использования:
$results = $conn->safeQuery("SELECT username FROM users WHERE id = ?", [$uid]);
if($results){
echo $results[0][0]; // first row, first column
// or
echo $results[0]['username']; // first row, get column by name
}