2014-06-30 74 views
3

我是新来的PHP和MySQL。我有一个表user_entries和两列max_valnum的数据库。PHP,mysqli数组

我已经使用下面的代码将我的两列提取到数组中,然后使用下面的函数numberTimesOver来确定$num[$i] > $limit多少次$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) 
+0

您的代码将返回像这样的数组''[“num”=> 10],[“num”=> 6],[“num”=> 10],...]'。显然,您的'numberTimesOver'函数未设置为处理此格式,因为它预计每个数组项都是标量(整数)值。另外,为什么两个查询?没有'ORDER BY'子句,不能保证'$ val'和'$ num'的索引条目将属于同一个元组 – Phil

+0

好吧,我现在明白fetch_assoc不会以整数形式返回数组为什么它不工作。我使用了两个查询,所以我可以分别提取两个列。我看到了ORDER BY,并不太清楚如何去做,所以我认为这可能会起作用。我将如何将数组转换为整数数组? – user3788874

回答

3

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

看起来你要计算的行数,其中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; 

总结...

  1. 我创建了一个COUNT查询因为这是你后的数据。该查询包含WHERE条款中所需的参数/条件。
  2. prepare方法准备一条SQL语句。有了这个,你可以绑定参数(见下一点)。将该查询看作一个函数,并将该字符作为该函数的参数。参考 - http://php.net/manual/mysqli.prepare.php
  3. bind_param绑定PHP变量以用作查询的参数。这些顺序是?字符出现的顺序。 "ii"字符串表示格式,i含义整数,所以两个整数。请参阅http://php.net/manual/mysqli-stmt.bind-param.php
  4. execute只是在数据库服务器上执行查询。请参阅http://php.net/manual/mysqli-stmt.execute.php
  5. bind_result将语句列结果(按顺序)绑定到所提供的PHP变量。由于我们只有一列(COUNT(1)),我们只需绑定一个变量($sum)。请参阅http://php.net/manual/mysqli-stmt.bind-result.php
  6. fetch只是获取下一行结果并填充绑定的结果变量。由于COUNT语句只有一行,我们只需要运行一次。请参阅http://php.net/manual/mysqli-stmt.fetch.php
+1

@ user3788874看看这个方法吧! – TribalChief

+0

我如实地没有完全理解你做了什么,但它的工作原理。你太棒了,非常感谢,并感谢Thauwa的帮助。 :D现在我会在继续之前尝试理解这一点。 – user3788874

+0

@ user3788874我很乐意解释任何你不明白的东西,如果你需要澄清我使用过的* mysqli *方法,总会有PHP手册。 – Phil

3

尝试:

$val[]= $row['max_val']; 

$num[] = $row['num']; 

代替。

+0

我试过并改变它,现在当我尝试使用这个函数时,我想到了错误。 “调用未定义的函数”。 – user3788874

+0

你确定你有'函数numberTimesOver($ number,$ max,$ limit){'和你的测试脚本中后面的代码? – TribalChief

+0

我有一个不同的.php文件,我用require_once函数来调用它。它适用于我的$ a和$ b数组。所以我知道该功能正在工作,所以我不认为它的工作。我不知道为什么。 – user3788874