PHP、mysqli数组
我不熟悉php和mysql。我有一个数据库,其中有一个表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
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;