我已经在这个问题上摸不着头几天了,我想我错过了那个显而易见的事情,所以我希望有人可以提出一些建议。
我有一个sql语句,它从数据库中选择最后8条记录,然后我将它填入数组并反转它,这是出于设计原因。我这样做是使用下面的陈述。
mysql_select_db($database_OASDB, $OASDB);
$sql = "SELECT *, ROUND(InvoiceNo, 0) AS SnPf, RIGHT(InvoiceNo, 3) AS SnSf FROM table WHERE Unit = 'Param1' AND CustomerName = 'Param2' AND Component = 'Param3' AND Site = 'Param4' ORDER BY SnPf DESC, SnSf ASC LIMIT 8";
$result = mysql_query($sql) or die(mysql_error());
$array = array();
while($row = mysql_fetch_assoc($result)) {
$array[] = $row;
}
$a = array_reverse($array);
这很好用,并使用各种
显示在表格中现在我需要以不同的方式循环使用该语句5次。
我真的希望这是有道理的。
任何想法都会受到赞赏..
由于
安德鲁
答案 0 :(得分:1)
您可以使用PDO或MySQLi执行此操作,您当前的MySQL版本 DEPRECATED 并强烈建议不要使用它,而是查看MySQLi和PDO,它们具有适合您所需的方法要做,
我将运行一个非常快速的示例,但我认为您需要了解MySQL和MySQLi之间的差异(有许多网站提供了很好的建议,请谷歌)
你的MySQLi最好采用面向对象的形式,你会有一个MySQLi对象,其中包含你的连接数据:
Mysqli对象(此处称为Dbx())
Dbx() {
private $dbiUser = username;
private $dbiPass = password;
private $dbiName = database name;
public function __construct(){
$this->dbiLink = new mysqli("localhost", $this->dbiUser, $this->dbiPass, $this->dbiName);
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
if ( ! $this->dbiLink )
{
die("Connection Error (" . mysqli_connect_errno() . ") "
. mysqli_connect_error());
mysqli_close($this->dbiLink);
}
else
{
$this->dbiLink->set_charset("latin1");
}
return true;
}
}
public function fetchResult($result)
{
/***
* For use with MySQLi->dbiLink Object.
* Returns the result as an array of KEY=>VALUE pairs from the Database.
**/
$resultsArray = array();
if ($result instanceof mysqli_stmt) {
$result->store_result();
$variables = array();
$data = array();
$meta = $result->result_metadata();
while ($field = $meta->fetch_field()) {
$variables[] = & $data[$field->name]; // pass by reference
}
call_user_func_array(array($result, 'bind_result'), $variables);
$i = 0;
while ($result->fetch()) {
$resultsArray[$i] = array();
foreach ($data as $k => $v)
$resultsArray[$i][$k] = $v;
$i++;
}
} elseif ($result instanceof mysqli_result) {
while ($row = $result->fetch_assoc()) {
$resultsArray[] = $row;
}
}
unset($row);
return $resultsArray;
}
现在,在您的PHP代码页中,您首先需要调用上面的类文件:
require "includes/classes/dbx.class.inc.php";
然后你需要启动新对象:
$database = new Dbx();
现在您可以使用$ database作为与数据库的MySQLi连接。
首先,将您的5个参数设置为数组(如Codrutz codrutz所述):
$paramaters[0][] = $param1;
$paramaters[0][] = $param2;
$paramaters[0][] = $param3;
$paramaters[0][] = $param4;
$paramaters[0][] = $param5;
...
$paramaters[1][] = $param12;
$paramaters[1][] = $param22;
$paramaters[1][] = $param32;
$paramaters[1][] = $param42;
$paramaters[1][] = $param52;
等。
现在您拥有$parameters
中的所有参数,您可以编辑原始查询以查看给定的五个(或多个)参数行。
注意:该数据不是直接插入SQL,而是应用于MySQL上的?
字符,这与使用::variablename
结构的PDO略有不同。
foreach ($parameter as $paramRow){
$sql = "SELECT *, ROUND(InvoiceNo, 0) AS SnPf, RIGHT(InvoiceNo, 3) AS SnSf FROM table WHERE Unit = ? AND CustomerName = ? AND Component = ? AND Site = ? ORDER BY SnPf DESC, SnSf ASC LIMIT 8";
$sqlQuery = $database->prepare($sql);
准备上面的陈述。 bind_param的第一部分是被绑定的数据类型 - (s)tring,(i)nteger,(d)double [numeric]或(b)lob [file / big chunks]。
这会将内部数组中的值绑定到SQL查询中的?
。
$sqlQuery->bind_param("ssss",$paramRow[0],$paramRow[1],$paramRow[2],$paramRow[3]);
$sqlQuery->execute();
$result[] = $database->fetchresult($sqlQuery); ///fetches the results using the custom method, above.
$sqlQuery->close();
}
//end the foreach loop.
因此,现在这将具有$result
数组的结果的名称值数组,每个初始行将对应于$parameters
查询的每个初始行。要根据需要反转数组,您仍然可以使用array_reverse,但数据是按名称选择的,应该这样引用。
一些限定符:
我没想到这个答案会变得很大,PDO在处理表输出方面比MySQLi灵活得多。我也意识到这可能有点像#WOW,wtf?"给你,但不要担心,在其他地方阅读,它应该几乎适合到位。我想用MySQLi / PDO的以下摘要替换我写的所有内容
$parameters = array of values(5) of values(4)
foreach ($parameter as $row){
Apply row array values to the SQL statement
Get the result
Arrange the result
Save the result to an array
}
您的输出将是
形式的数组 $结果[parameter
] [row per parameter
] [table data from row
]
再次道歉这已成为一个巨大的答案。
答案 1 :(得分:0)
创建一个包含您要使用的参数的数组,并使用foreach
使用您作为参数创建的数组元素循环语句。