几天来,我一直在抓挠我的头,我想我还没有找到明显的东西,所以我希望有人可以提出一些建议。

我有一条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/

10-15 18:11