【问题标题】:How get an array from a MySQL column with mysqli_fetch_array如何使用 mysqli_fetch_array 从 MySQL 列中获取数组
【发布时间】:2015-03-01 21:16:01
【问题描述】:

我正在尝试编写 IP 禁令。用户 IP 存储在数据库中。我可以手动将该用户 IP 添加到禁止列表。不幸的是,以下代码不起作用。我认为问题在于将数组从数据库中取出。

$ip = $_SERVER['REMOTE_ADDR'];
$bannedips = array();
$notBanned = true; //later used to check, if ip is banned

$sql = "SELECT ip FROM ipban";
$result = mysqli_query($conn, $result);
while($row = mysql_fetch_array($result, MYSQL_NUM)){
    $bannedips[] = $row;
}
if (in_array($ip, $bannedips)) {
    $notBanned = false;
}

【问题讨论】:

  • $bannedips[] = $row['ip']; 以防MYSQL_NUM - $bannedips[] = $row[0] 至少尝试打印您的变量以查看它们包含的内容。
  • @SimonMathewson 我根据您的要求编辑我的答案,请参阅下面stackoverflow.com/a/28799306/3653989

标签: php mysql sql arrays mysqli


【解决方案1】:

出于性能原因,您应该只搜索 ip,而不是查询所有条目

$ip = $_SERVER['REMOTE_ADDR'];
$notBanned = true; //later used to check, if ip is banned

$sql = "SELECT ip FROM ipban WHERE ip = ?";
if ($stmt = mysqli_prepare($conn, $sql)) {
    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "s", $ip);

    if($result = mysqli_query($conn, $sql)){
        $notBanned = false;
        mysqli_free_result($result);
    }
}

面向对象的风格应该是:

$mysqli = new mysqli(/* Whatever needed to establish connection */);
$ip = $_SERVER['REMOTE_ADDR'];
$notBanned = true; //later used to check, if ip is banned

$sql = "SELECT ip FROM ipban WHERE ip = ?";

if ($stmt = $mysqli->prepare($sql)){
    $stmt->bind_param("s", $ip);
    $stmt->execute();
    if($stmt && $stmt->num_rows > 0){
        $notBanned = false;
    }
}

【讨论】:

  • 谢谢!这看起来像面向对象的 mysqli 怎么样?
【解决方案2】:

只是改变:

while($row = mysql_fetch_array($result, MYSQL_NUM)){
    $bannedips[] = $row;

而且你不能将 mysqli 函数与 mysql 合并

$result = mysqli_query($conn, $result);
while($row = mysql_fetch_array($result, MYSQL_NUM)){

终于(编辑):

$host = "example";
$username = "example";
$password = "example";
$database = "example";

$ip = $_SERVER['REMOTE_ADDR'];
$bannedips = array();
$notBanned = true; //later used to check, if ip is banned

$connection = new mysqli($host, $username, $password, $database);

$query = $connection->query("SELECT ip FROM ipban");

while ($row = $query->fetch_array()) {
    $bannedips[] = $row['ip'];
}

if (in_array($ip, $bannedips)) {
    $notBanned = false;
}  

您可以在以下位置阅读更多信息:

http://php.net/manual/en/function.mysql-fetch-array.php

【讨论】:

    【解决方案3】:

    问题存在于您的 while 循环中。在将数据附加到 $bannedips 数组时,您忘记从 $row 数组中选择第零个(ip 列)键。

    $row 更改为 row[0],如下所示:

    while($row = mysql_fetch_array($result, MYSQL_NUM)){
        $bannedips[] = $row[0];
    }
    

    【讨论】:

    • 还有其他错误:can't merge mysqli function with mysql
    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2021-08-30
    • 2013-08-28
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多