PHP、mysqli数组

PHP、mysqli数组,php,arrays,mysqli,Php,Arrays,Mysqli,我不熟悉php和mysql。我有一个数据库,其中有一个表user\u entries和两列max\u val和num 我使用以下代码将两列提取到数组中,然后使用下面的函数numbertimeover确定$num[$I]>$limit在$val[$I]=10时的次数。数字从0到10不等 当我对表中的两个数组使用我的函数时,我得到一个0的输出,而它应该是4。当我使用$a和$b数组时,我得到的输出是2 我哪里做错了?当我试图将表列转换为数组时,我认为我出错了 <?php require_once

我不熟悉php和mysql。我有一个数据库,其中有一个表
user\u entries
和两列
max\u val
num

我使用以下代码将两列提取到数组中,然后使用下面的函数
numbertimeover
确定
$num[$I]>$limit
$val[$I]=10
时的次数。数字从0到10不等

当我对表中的两个数组使用我的函数时,我得到一个0的输出,而它应该是4。当我使用
$a
$b
数组时,我得到的输出是2

我哪里做错了?当我试图将表列转换为数组时,我认为我出错了

<?php
require_once('functions.php');
$mysqli = new mysqli('localhost', 'root', NULL, 'practice');

$val_sql = "SELECT `max_val` FROM `user_entries`";
$valData = $mysqli->query($val_sql);

$num_sql = "SELECT `num` FROM `user_entries`";
$numData = $mysqli->query($num_sql);

$val = array();
while($row = $valData->fetch_assoc())
{
    $val[]= $row;
}

$num = array();
while ($row = $numData->fetch_assoc())
{
    $num[] = $row;
}

//$a = [10, 4, 5, 8, 3];
//$b = [10, 6, 10, 10, 2];

function numberTimesOver($number, $max, $limit) {

    $sum = 0;

    for ($i = 0; $i < count($max); $i++)
    {
        if ($max[$i] == 10 && $number[$i] > $limit)
        {
            $sum += 1;
        }
    }
    print($sum);
}

numberTimesOver($val, $num, 6)
试试:


相反。

我认为你从错误的角度来看待这个问题

似乎要计算
max_val
大于
$limit
(6)且
num
等于10的行数

关系数据库在这方面非常擅长。您所需要的只是以下内容

$maxVal = 6;
$num = 10;
$stmt = $mysqli->prepare(
    'SELECT COUNT(1) FROM `user_entries` WHERE `max_val` > ? AND `num` = ?');
$stmt->bind_param('ii', $maxVal, $num);
$stmt->execute();
$stmt->bind_result($sum);
$stmt->fetch();

echo $sum;
总而言之

  • 我创建了一个
    COUNT
    查询,因为这是您要查找的数据。查询包括
    WHERE
    子句中所需的参数/条件
  • prepare
    方法准备SQL语句。使用此选项,可以绑定参数(请参见下一点)。将查询视为一个函数,将
    字符视为该函数的参数。参考-
  • bind_param
    将要用作查询参数的PHP变量绑定到查询。这些字符按
    字符出现的顺序排列。
    “ii”
    字符串表示格式,
    i
    表示整数,所以是两个整数。看
  • execute
    只在数据库服务器上执行查询。看
  • bind_result
    将语句列结果(按顺序)绑定到提供的PHP变量。因为我们只有一列(
    COUNT(1)
    ),所以我们只需要绑定一个变量(
    $sum
    )。看
  • fetch
    仅获取下一行结果并填充绑定的结果变量。由于
    COUNT
    语句只有一行,我们只需要运行一次。看

  • 您的代码将返回如下数组
    [[“num”=>10],“num”=>6],“num”=>10],…]
    。显然,
    numberTimesOver
    函数没有设置为处理这种格式,因为它希望每个数组项都是标量(整型)值。还有,为什么有两个问题?如果没有
    ORDER BY
    子句,就不能保证
    $val
    $num
    的索引项将属于同一个元组好的,我现在了解到fetch assoc不会以整数形式返回数组,这就是它不工作的原因。我使用了两个查询,因此可以分别提取这两列。我看到了订单,不太确定该怎么办,所以我想这可能会奏效。如何将数组转换为整数数组?我尝试了这个方法并对其进行了更改,现在在尝试使用该函数时出现了错误。“调用未定义的函数”。您确定您有行
    函数numberTimeOver($number,$max,$limit){
    以及测试脚本中的后续代码?我在另一个.php文件中有它,并且我使用了require_once函数来调用它。它与我的$a和$b数组一起工作。因此我知道该函数正在工作,所以我认为它不起作用。我不确定为什么。@user3788874确实看看这种方法!我真的不完全理解w你已经做到了,但它很管用。你很棒,非常感谢并感谢Thauwa的帮助。:D我现在将尝试理解这一点,然后再继续。@user3788874我很乐意解释你不理解的任何内容,如果你需要对我使用的mysqli方法进行说明,总会有PHP手册。好吧,我得到了mysqli->prepare只获取列和maxVal>6和num=10的值,因为我在其他列上测试了它,我需要它。首先,为什么在我更改列名时使用?但保持变量$maxVal=6和$num=10不变?之后,bindparam和bindres会做什么ult do?@user3788874我已经用更多信息更新了我的答案
    $num[] = $row['num'];
    
    $maxVal = 6;
    $num = 10;
    $stmt = $mysqli->prepare(
        'SELECT COUNT(1) FROM `user_entries` WHERE `max_val` > ? AND `num` = ?');
    $stmt->bind_param('ii', $maxVal, $num);
    $stmt->execute();
    $stmt->bind_result($sum);
    $stmt->fetch();
    
    echo $sum;