PHP, mysqli 数组
Posted
技术标签:
【中文标题】PHP, mysqli 数组【英文标题】:PHP, mysqli arrays 【发布时间】:2014-08-20 09:56:10 【问题描述】:我是 php 和 mysql 的新手。我有一个数据库,其中有一个表 user_entries
和两列 max_val
和 num
。
我使用下面的代码将我的两列提取到数组中,然后使用下面的函数numberTimesOver
来确定@987654325@ 时$val[$i] = 10
的次数。数字范围从 0 到 10。
当我将函数与表中的两个数组一起使用时,我得到的输出为零,而它应该是 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)
【问题讨论】:
您的代码将返回类似[["num" => 10], ["num" => 6], ["num" => 10], ...]
的数组。显然,您的 numberTimesOver
函数未设置为处理这种格式,因为它希望每个数组项都是标量(整数)值。另外,为什么要两个查询?如果没有ORDER BY
子句,就不能保证$val
和$num
的索引条目将属于相同的元组
好的,我现在明白 fetch_assoc 不会以整数形式返回数组,这就是它不起作用的原因。我使用了两个查询,所以我可以分别提取两列。我看到了 ORDER BY 并且不太确定如何去做,所以我认为这可能会起作用。我将如何将数组转换为整数数组?
【参考方案1】:
我认为你从错误的角度来处理这个问题。
您似乎想计算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 语句。有了这个,你可以绑定参数(见下一点)。将查询视为一个函数,将?
字符视为该函数的参数。参考 - http://php.net/manual/mysqli.prepare.php
bind_param
将要用作参数的 PHP 变量绑定到查询。这些是按照?
字符出现的顺序。 "ii"
字符串表示格式,i
表示 integer,所以是两个整数。见http://php.net/manual/mysqli-stmt.bind-param.php
execute
只是在数据库服务器上执行查询。见http://php.net/manual/mysqli-stmt.execute.php
bind_result
将语句列结果(按顺序)绑定到提供的 PHP 变量。由于我们只有一列(COUNT(1)
),我们只需要绑定一个变量($sum
)。见http://php.net/manual/mysqli-stmt.bind-result.php
fetch
只是获取下一行结果并填充绑定的结果变量。由于COUNT
语句只有一行,我们只需要运行一次。见http://php.net/manual/mysqli-stmt.fetch.php
【讨论】:
@user3788874 看看这个方法! 说实话,我并不完全理解你做了什么,但它确实有效。你太棒了,非常感谢,感谢Thauwa的帮助。 :D 在继续之前,我现在会尝试理解这一点。 @user3788874 我很乐意解释您不理解的任何内容,如果您需要澄清我使用的 mysqli 方法,总有 PHP 手册。 好吧,我知道 mysqli->prepare 只是获取列,并且只获取 maxVal > 6 和 num = 10 的值,因为我在需要它的其他列上对其进行了测试并且它有效.首先,为什么要放 ?当我更改列名但保留变量 $maxVal = 6 和 $num = 10 时在工作中,是否相同?之后,bind_param 和 bind_result 究竟做了什么? @user3788874 我已经用更多信息更新了我的答案【参考方案2】:试试:
$val[]= $row['max_val'];
和
$num[] = $row['num'];
改为。
【讨论】:
我试过这个并改变了它,现在我在尝试使用该功能时遇到错误。 “调用未定义的函数”。 你确定你的测试脚本中有function numberTimesOver($number, $max, $limit)
这行代码吗?
我把它放在一个不同的 .php 文件中,并且我使用了 require_once 函数来调用它。它适用于我的 $a 和 $b 数组。所以我知道该功能正在运行,所以我认为它不起作用。我不知道为什么。以上是关于PHP, mysqli 数组的主要内容,如果未能解决你的问题,请参考以下文章
PHP / MySQLi - 数组作为 bind_param