Php 使用select prepared语句获取用户名

Php 使用select prepared语句获取用户名,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我写了这段代码,但它只是输出“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->

我写了这段代码,但它只是输出“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();
}
这个呢,


我使用了
->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();
    }
如果我们只检索一个结果,假设在下面没有循环的情况下没有重复的结果

   $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();
    }
不会返回结果。该函数没有返回任何有用的信息。您需要做的是获得mysqli结果。有两种方法可以做到这一点

更简单的方法是:

$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\u result()
的另一种方法:

在我看来,这更难理解。另外,如果你想得到更多的专栏,它会很快变得非常复杂

老实说,mysqli不是很友好,使用起来很麻烦。我强烈建议切换到PDO,但是如果您不能尝试将mysqli函数封装到某个类或函数中。YCS有一个这样的例子,我最近用包装器类编写了一个

我在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
}

我根本看不到任何返回。@MarkusZeller我的意思是在“返回”中的“回音”,很抱歉我不擅长phpRead文档:我使用了
->fetch_assoc()
让我们在数组中获取结果,而不是
->fetch()已在问题中使用,已采取行动
$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
}