2013-04-24 71 views
0

我有一个SQL数据库被查询,需要根据用户输入计算排序,然后按所述计算排序,然后打印出。PHP添加一个计算结果,推到结果数组,排序,然后打印

奇怪,我知道。

因此,随着被称为谷歌甲骨文的帮助下,我想出了下面的代码:

$result = mysql_query($query) or die(mysql_error()); 
$buffer = array(); 
while($row = mysql_fetch_array($result)){ 
$vars; 
$calc1 = [[equation]]; 
$calc2 = [[equation]]; 
$calc3 = [[equation]]; 
$calc4 = [[equation]]; 

$row['calc1'] = $calc1; 
$row['calc2'] = $calc2; 
$row['calc3'] = $calc3; 
$row['calc4'] = $calc4; 

$buffer[] = $row; 
} 

print "<table border='1px' cellpadding='4px' cellspacing='0'><tr><th>TABLE HEADERS</th></tr>"; 
foreach($buffer as $row){ 
    print "<tr><td>"; 
print $row['rows....']; 

print "</tr>"; 

} 
unset($buffer, $row); 
print "</table>"; 
mysql_close(); 

显然复杂得多,但代码是目前专有的。我将有数百个条目,计算如下:

round((((($b1/$b2) * ($bcMix * $pVm)) + (($c1/$c2) * ((1 - ($bcMix * .01)) * $pVm)) * 12) * 5) + $pP, 2);

我也想用两个标准来排序结果:计算本身以及数字数据库条目 - 无论是从低到高。 usort导致我的网站崩溃(无论何种原因):

usort($buffer, function($a, $b){ 
return $a['tcoy1'] < $b['tcoy1']; 
}); 

有什么建议?

+3

array_push需要一个数组推动,以及推动什么。另外,你确定你不能纯粹在SQL中进行排序吗? – bfavaretto 2013-04-24 03:26:11

+0

排序标准基于用户输入 - 所以需要先计算出排序后的标准。 SQL可以做很好的计算吗? $ row是一个数组,每当我做'var_dump($ row)'它打印'array(...'。 – Christopher 2013-04-24 03:28:06

+0

@Christopher:向我们展示计算。是的,MySQL可以做计算。取决于它们有多复杂,你有很多记录,在SQL和PHP中执行它们可能会也可能不会更好 – mpen 2013-04-24 03:55:01

回答

2

尽量取缓冲:

$result = mysql_query($query) or die(mysql_error()); 

$buffer = array(); 

while($row = mysql_fetch_array($result)){ 
    $vars; 

    $calc1 = [[equation]]; 
    $calc2 = [[equation]]; 
    $calc3 = [[equation]]; 
    $calc4 = [[equation]]; 

    $row['calc1'] = $calc1; 
    $row['calc2'] = $calc2; 
    $row['calc3'] = $calc3; 
    $row['calc4'] = $calc4; 

    $buffer[] = $row; 
} 

// sort $buffer by 'calc1' DESC: 
usort($buffer, function($a, $b){ return $a['calc1'] < $b['calc1']; }); 

print "<table border='1px' cellpadding='4px' cellspacing='0'><tr><th>TABLE HEADERS</th></tr>"; 

foreach($buffer as $row){ 
    print "<tr><td>"; 
    print $row['rows....']; 
    print "</td></tr>"; 
} 

unset($buffer, $row); 

print "</table>"; 
mysql_close(); 

你有inappropirate使用array_push()。检查手册。不过,我认为它甚至不需要那里。

P.S:php_mysql扩展deprecated。我建议使用php_mysqliphp_pdo

+0

Calc1的排序从最低到最高,然后是数据库条目Var1。 – Christopher 2013-04-24 03:33:29

+0

I不知道为什么,但那usort声明崩溃我的网站... – Christopher 2013-04-24 04:37:02

+0

@Christopher,奇怪...尝试它可能是因为anonimous函数。尝试应用回调[旧时尚的方式](http://php.net/手册/ en/language.types.callable.php) – BlitZ 2013-04-24 05:03:31

2

使用array_multisort()usort()具有自定义比较功能。

1

如果你做任何复杂的计算,你最好在PHP做他们和这里的原因:

  1. 没有为大多数数学类型的支持在PHP,在MySQL没有那么多。
  2. 在PHP中,您可以使用响应来处理失败的等式,如果您在数据库服务器上执行它,您必须提取错误,分析并确定发生了什么。
  3. 数据库被设计用于存储数据,而PHP是用于运行程序(和方程)的编程语言。
  4. 您可以将方程存储在安全的数据库表中,然后通过PHP随意运行它们。

任何与MySQL在名称中仅用于数据库。你正在做一些额外的事情。我假设因为你正在拉取一个查询(尽管你不显示查询)你正在存储数据库中的方程。

当您使用mysqli_fetch_array()时,您已将数据库中的结果拉到数组中,因此无需再调用它两次。除非将其加载到现有的var或array中,否则任何在while()语句中引用的内容都将在此生命中生存。

将查询存储在数据库中是一个棘手的问题,因为您可以使用单引号存储$字符,并将其作为稍后可用于评估的文字字符。

<?php 
//If the vars are set then we're ready for processing 
if(!empty($_POST['var1'])&&!empty($_POST['var2'])){ 

$query = 'select * from equations'; 
$result = mysqli_query($query) or die(mysqli_error()); 

//Create the array for storing the equations 
$equations = array(); 
while($row = mysqli_fetch_array($result)){ 
    $id = $row['id']; 
    $equation = $row['id']; 
    //store the equations into the array 
    $equations[$id]=$equation; 
} 

//Do some sort of check here... I'm expecting a number 
if(is_numeric($_POST['var1'])){ 
    $var1 = $_POST['var1']; 
} else { 
//set a default (not 0) 
    $var1 = 1; 
} 

//Do some sort of check here... I'm expecting another number 
if(is_numeric($_POST['var2'])){ 
    $var2 = $_POST['var2']; 
} else { 
//set a default (not 0) 
    $var2 = 1; 
} 

//Cool little function for doing equations with 2 vars being passed. 
function doEquation($eq,$var1,$var2){ 
//eg. $eq = '$var1+$var2'; 
    eval("\$answer=\"$eq\";"); 
    return $answer; 
} 

$code = "<!doctype html>\n<html>\n<body>\n"; 
$code .= "<table style='padding:4px;border:none;'><tr><th>Table Header</th></tr>"; 

foreach($equations as $id=>$eq){ 
    $answer = doEquation($eq,$var1,$var2);  
    $code .= "<tr><td>Answer $id = $answer</td></tr>\n";  

} 

$code .= "</table>"; 
$code .= "</body></html>"; 
} else { 
//No vars set we can show them the form for the calculations. 

$code = "<!doctype html>\n<html>\n<body>\n"; 
$code .= "<form method='post'>"; 
$code .= "Enter Var1<br>"; 
$code .= "<input type='number' name='var1' value='1' />"; 
$code .= "Enter Var2<br>"; 
$code .= "<input type='number' name='var2' value='1' />"; 
$code .= "<input type='submit' name='submit' value='Calculate' />"; 
$code .= "</form>"; 
$code .= "</body></html>"; 
} 

print $code; 

?> 

你会想要小心一些计算。您必须键入并检查所有传入变量。例如,你不能被0除,因为它会抛出一个错误。也可以加载一个非常复杂的公式,并有足够的信息来使服务器崩溃。记住任何进入服务器的东西都会被解析,需要过滤和检查你所期望的。你不想使用echo命令,并有人开始投掷$_SERVER变量到屏幕上。

也因为在我的例子中我们使用eval()你想确保这个不能执行用户提交的任何额外的方程或函数。所以必要时可以使用strip_tags()等等。由于我的示例正在等待一个数字,因此我正在检查它是否为is_numeric

+0

你可能误解了......我不想把计算放入数据库,我只想做一个ca根据用户输入和数据库条目计算,然后使用结果对结果进行排序并打印出来。难以用专有代码显示... – Christopher 2013-04-24 04:25:55

+0

几周前,我制造了8台专有计算器,用于计算工业管道上的焊接时间。在PHP中执行它们要容易得多。 – 2013-04-24 04:35:58

+0

我做的其他大部分计算器都是统计用户跟踪应用程序,通常它们可以用'MySQL'编写,尽管在这方面使用'PHP'或'MySQL'的速度大致相同。 – 2013-04-24 04:42:03