我有一个正在查询的SQL数据库,需要根据用户输入进行排序,然后按所述计算排序,然后打印出来。
很奇怪,我知道。
所以,在谷歌的神谕的帮助下,我提出了以下代码:
$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'];
});
有什么建议吗?
答案 0 :(得分: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();
您不恰当地使用array_push()
。检查手册。不过,我认为它甚至不需要它。
P.S。: php_mysql
扩展名为deprecated。我建议改为使用php_mysqli
或php_pdo
。
答案 1 :(得分:2)
将array_multisort()
或usort()
与自定义比较功能结合使用。
答案 2 :(得分:1)
如果您正在进行任何复杂的计算,最好在PHP
中进行这些计算,这就是原因:
名称中包含MySQL
的任何内容仅适用于数据库。你正在做一些额外的事情。我假设这是因为你正在提取一个查询(尽管你没有显示查询)你将方程式存储在数据库中。
使用mysqli_fetch_array()
时,您已将数据库中的结果拉入数组,因此无需再调用两次。除非将while()
语句中的任何内容加载到现有的var或数组中,否则它将在$
语句中生效。
将查询存储在数据库中是一件非常棘手的事情,因为您可以存储带有单引号的<?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;
?>
字符,并将其作为文字字符,以后可以用于评估。
echo
你需要小心一些计算。您必须键入并检查所有传入变量。例如,你不能除以0,因为它会抛出一个错误。此外,还可以加载一个非常复杂的等式,其中包含足够的信息以使服务器崩溃。记住要进行解析的任何进入服务器的内容都需要根据您的期望进行过滤和检查。您不想使用$_SERVER
命令并让某人开始向屏幕投掷eval()
个变种。
另外,因为在我的示例中我们使用strip_tags()
,您要确保这不能执行用户提交的任何其他方程式或函数。所以is_numeric
等等。由于我的例子是期待一个数字,我正在检查它是否{{1}}。