0

我有一个正在查询的 SQL 数据库,需要通过基于用户输入的计算进行排序,然后按所述计算排序,然后打印出来。

很奇怪,我知道。

因此,在称为 Google 的预言机的帮助下,我想出了以下代码:

$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']; 
});

有什么建议么?

4

3 回答 3

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(). 检查手册。不过,我认为那里甚至不需要它。

PS: php_mysql扩展名已弃用。我建议使用php_mysqliorphp_pdo代替。

于 2013-04-24T03:26:50.913 回答
2

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

于 2013-04-24T03:41:38.490 回答
1

如果您要进行任何复杂的计算,最好在其中进行计算,PHP原因如下:

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

?>

您需要小心一些计算。您必须键入并检查所有传入的变量。例如,您不能除以 0,因为它会引发错误。也可以加载一个非常复杂的方程式,其中包含足够的信息来使服务器崩溃。请记住,将要解析的任何进入服务器的内容都需要过滤并检查您的预期。您不想使用echo命令并让某人开始将$_SERVERvars 扔到屏幕上。

还因为在我的示例中,我们使用eval()您希望确保这不能执行用户提交的任何其他方程或函数。strip_tags()依此类推。由于我的示例需要一个数字,因此我正在检查它是否为is_numeric.

于 2013-04-24T04:17:53.333 回答