Получить имя пользователя, используя выбранный подготовленный оператор - PullRequest
2 голосов
/ 16 февраля 2020

Я написал этот код, но он просто выводит «1». Он должен вывести имя пользователя выбранного пользователя.

$uid = $_GET['id'];
if (empty($uid)) {
    echo "Error: Wrong input of values.";
} else {
    $stmt = $conn->prepare("SELECT username FROM usersinfo WHERE id = ?");
    $stmt->bind_param("s", $uid);
    $stmt->execute();
    $result = $stmt->fetch();
    echo $result;
    $stmt->close();
    $conn->close();
}

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

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
}
0 голосов
/ 16 февраля 2020

Как насчет этого,

Я использовал ->fetch_assoc();, чтобы мы извлекали результаты в массив, а не ->fetch();, который использовался в вопросе

в случае имени пользователя имеет дубликаты: - затем

   $uid = $_GET['id'];
    if (empty($uid)) {
        echo "Error: Wrong input of values.";
    } else {
        $stmt = $conn->prepare("SELECT username FROM usersinfo WHERE id = ?");
        $stmt->bind_param("s", $uid);
        $stmt->execute();
        $result = $stmt->get_result();

         while($row = $result->fetch_assoc())  { //fetch_assoc() function fetches a result row as an associative array - here we are putting it in a loop
          echo $row['username'];
         }

        $stmt->close();
        $conn->close();
    }

Если мы хотим получить только один результат, при условии, что нет дубликатов, которые мы могли бы использовать ниже без l oop.

   $uid = $_GET['id'];
    if (empty($uid)) {
        echo "Error: Wrong input of values.";
    } else {
        $stmt = $conn->prepare("SELECT username FROM usersinfo WHERE id = ?");
        $stmt->bind_param("s", $uid);
        $stmt->execute();
        $result = $stmt->get_result();

         $row = $result->fetch_assoc(); //fetch_assoc() function fetches a result row as an associative array
         echo $row['username']; //we can specify just to return specific column i.e. username

        $stmt->close();
        $conn->close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...