繁体   English   中英

来自MySQL的PHP​​计数数组计数不正确

[英]PHP Count Arrays from MySQL counts Incorrectly

我无法正确计算从数据库中提取的数组中的元素。 请在下面查看我的代码:

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);

// Check connection
if (!$conn) 
{
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully!"; 

//NEW QUERY TO OUR DATABASE
$query = $conn -> query("Select distinct Race from Races");
while($race[] = $query->fetch_object());

//Check how many elements are within our query
$racecount = count($race);
echo "<br>" . $racecount . "<br><br>";
$racecount = count($race,COUNT_RECURSIVE);
echo "<br>" . $racecount . "<br><br>";

var_dump($race);

echo "<br><br><br>";

两种方式同时使用两种类型的count()会产生相同的结果“ 4”。 但是,请从我的var_dump查看结果。

array(4) { [0]=> object(stdClass)#3 (1) { ["Race"]=> string(5) "Human" } [1]=> object(stdClass)#4 (1) { ["Race"]=> string(7) "Vampire" } [2]=> object(stdClass)#5 (1) { ["Race"]=> string(5) "Demon" } [3]=> NULL } 

Var_dump显示它是一个包含4个元素的数组。 所以计数是正确的,只是没有给我我想要的电话号码。

因此,我有三个问题。

1)如何正确计算元素?

2)有人可以向我解释为什么这读作四个要素吗?

3)我的数组不是多维的吗? (因为两个计数产生的结果相同为4)

在此致以最诚挚的问候和谢意,

乔希

`while($race[] = $query->fetch_object());`

$query->fetch_object()返回一个null ,指示数据集中没有更多条目,但是您仍将该null值作为最后一个条目分配给$race数组,然后才允许while终止其循环....这就是为什么数组中有4个条目而不是3个的原因。

您的数组不是多维的,因为存储在$races数组中的实体是对象 ,而不是数组; 如果它是一个数组数组,它​​将是多维的

原因实际上很简单。 当使用while($race[] = $query->fetch_object())将数据插入数组while($race[] = $query->fetch_object())您总是插入最终的$query->fetch_object() ,该值等于null 那就是当您退出while循环时。 因此,就像您自己的var_dump一样,数组的最后一项将始终为null

解决此问题的一种方法就是简单地从结果中减去1。 另一种方法是实现这样的插入:

$race = [];
while($row = $query->fetch_object()) {
    array_push($race , $row);
}

最好的计数方法是简单地执行一个SQL COUNT命令:

$query = $conn->query("SELECT COUNT(DISTINCT Race) FROM Races");

您的php计数返回的是结果对象中字段的数量,而不是行的数量。

对您的SQL查询尝试以下操作:

$query = $conn->query("SELECT COUNT(DISTINCT Race) FROM Races");

如果您希望使用与现在相同的查询,请尝试:

$raceCount = $query->num_rows;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM