Как я могу получить неизвестное имя пользователя с данным идентификатором? - PullRequest
4 голосов
/ 18 марта 2020

Я получил числовой идентификатор из 20 символов, который выглядит как 10527391670258314752 , учитывая этот идентификатор, как я могу получить имя пользователя, связанное с ним?

Таблица выглядит следующим образом:

id                   | name | password | balance   
10527391670258314752 | Jhon | 12345    | 12.51

Имя пользователя, полученное из базы данных, затем должно быть сохранено в $_SESSION['name'].

Я пробовал это:

$connection = mysqli_connect('localhost', 'root', '', 'user_data');
$id = '10527391670258314752';

$query = "SELECT username FROM user_data WHERE id = '$id'";
$result = mysqli_query($connection, $query);

$record = mysqli_fetch_array($id);
$_SESSION['id'] = $record;

echo $_SESSION['id'];

Вывод Array() вместо имени.

Ответы [ 2 ]

5 голосов
/ 18 марта 2020

На самом деле это очень хороший вопрос, на который почти нет хороших ответов о переполнении стека.

В основном вам необходимо выполнить следующие шаги для выполнения запроса SELECT с помощью mysqli:

  • создать правильный оператор SQL SELECT и заменить все переменные в запросе на вопросительные знаки (называемые заполнители или параметры)
  • Подготовка результирующего запроса
  • Привязка всех переменных к ранее подготовленному оператору
  • Выполнение оператора
  • получение результирующей переменной mysqli из
  • получить ваши данные

Подробное объяснение можно найти в моей статье Как выполнить запрос SELECT с помощью Mysqli , а также вспомогательной функции чтобы упростить процедуру.

Следуя этой схеме, вот ваш код

$sql = "SELECT * FROM users WHERE id=?"; // SQL with parameters
$stmt = $conn->prepare($sql); 
$stmt->bind_param("s", $id);
$Stmt->execute();
$result = $stmt->get_result(); // get the mysqli result
$user = $result->fetch_assoc(); // fetch the data 

, теперь вы можете сохранить имя пользователя в переменной сеанса:

$_SESSION['name'] = $user['name'];
3 голосов
/ 18 марта 2020

Я настоятельно рекомендую избегать расширения mysqli. Вы должны использовать некоторую библиотеку абстракций базы данных вместо непосредственного использования функций mysqli. Класс mysqli не предназначен для самостоятельного использования.

Если вы действительно хотите сделать это с чистым классом mysqli, у вас есть несколько вариантов.

Во-первых, вам нужно правильно открыть соединение. Эти 3 строки гарантируют, что соединение готово:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // enable error reporting
$mysqli = new mysqli('localhost', 'username', 'password', 'dbname');
$mysqli->set_charset('utf8mb4'); // always set the charset

Затем необходимо подготовить оператор, связать параметр и выполнить его.

$id = '10527391670258314752';
$stmt = $mysqli->prepare('SELECT username FROM user_data WHERE id=?');
$stmt->bind_param('s', $id);
$stmt->execute();

После выполнения инструкции вам нужно получить результаты. Если у вас есть только одна переменная, вы можете просто использовать bind_result()

$stmt->bind_result($_SESSION['name']);
$stmt->fetch();
echo $_SESSION['name'];

Однако этот подход не рекомендуется и не очень гибкий. Вместо этого лучше получить весь набор результатов и получить массив, содержащий первую строку.

$result = $stmt->get_result();
$row = $result->fetch_array();
$_SESSION['name'] = $row['username'];
echo $_SESSION['name'];

В качестве альтернативы PDO тот же код будет выглядеть следующим образом:

session_start();

$pdo = new PDO("mysql:host=$host;dbname=$db;charset=$charset", $user, $pass, [
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_EMULATE_PREPARES => false,
]);

$id = '10527391670258314752';

$stmt = $pdo->prepare('SELECT username FROM user_data WHERE id=?');
$stmt->execute([$id]);
$_SESSION['name'] = $stmt->fetchColumn();
echo $_SESSION['name'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...