PHP, mysqli 数组

Posted

技术标签:

【中文标题】PHP, mysqli 数组【英文标题】:PHP, mysqli arrays 【发布时间】:2014-08-20 09:56:10 【问题描述】:

我是 phpmysql 的新手。我有一个数据库,其中有一个表 user_entries 和两列 max_valnum

我使用下面的代码将我的两列提取到数组中,然后使用下面的函数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" =&gt; 10], ["num" =&gt; 6], ["num" =&gt; 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打印数组问题

PHP / MySQLi - 数组作为 bind_param

PHP - 在 mysqli 查询中使用数组

MySQLi PHP 结果数组不兼容?

带有 LIKE 数组的 PHP 和 MYSQLI:无法正确回显所有内容

php mysql/mysqli获取数组