几天来,我一直在抓挠我的头,我想我还没有找到明显的东西,所以我希望有人可以提出一些建议。
我有一条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次。
我真的希望这是有道理的。
任何想法,将不胜感激..
谢谢
安德鲁
最佳答案
您可以使用PDO或MySQLi进行此操作,您当前使用的MySQL版本已弃用,强烈建议您不要使用它,而是查看MySQLi和PDO,它们已经针对您想要做的事情提供了适当的方法,
我将运行一个非常简单的示例,但我认为您需要阅读一下MySQL和MySQLi之间的区别(有很多网站提供了很好的建议,请google)
您的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 [数字]或(b)lob [文件/大块]。
这会将内部数组中的值绑定到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灵活得多。我还意识到,其中大部分可能有点“哇,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
}
您的输出将是以下形式的数组
$ result [
parameter
] [row per parameter
] [table data from row
]再次道歉,这已成为一个巨大的答案。
关于php - 用不同的参数php重复mysql查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28832751/