如何在一个php页面中运行多个查询?

时间:2014-06-03 06:07:20

标签: php database pdo

我有一个选择查询,然后是另一个选择查询但是另一个表。我需要运行第一个查询,然后如果找到了什么,则显示带有foreach循环的表。然后,运行第二个查询并选择另一个带有foreach循环的表。

这是我运行数据库的DB类:

class DB {
private static $_instance = null;
private $_pdo, 
        $_query, 
        $_error = false,
        $_count = 0;
public $_results;

private function __construct() {
    try {
        $this->_pdo = new PDO(...);
    } catch(PDOException $e) {
        die($e->getMessage());
    }
}

public static function getInstance() {
    if(!isset(self::$_instance)) {
        self::$_instance = new DB();
    }
    return self::$_instance;
}

public function query($sql, $params = array()) {
    $this->_error = false;
    if($this->_query = $this->_pdo->prepare($sql)) {
        $x = 1;
         if(count($params)) {
            foreach($params as $param) {
                $this->_query->bindValue($x, $param);
                $x++;
            }
        }
        if($this->_query->execute()) {
            $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
            $this->_count = $this->_query->rowCount();
        } else {
            $this->_error = true;
        }
    }

    return $this;
}

然后,在页面上我有以下内容:

<?php if ($st = DB::getInstance()->query("SELECT * FROM resum WHERE form_id = ? ORDER by date DESC", array(Input::get('formID')))) {
        if ($st->count()) { ?>

            <div id="topSeparateurClient">
            <div>Date</div>
            <div>Concessionnaire</div>
            <div>Client</div>
            <div>Voiture</div>
            <div>Prix</div>
            <div>Statut</div>
        </div>
        <div style="clear:both;"></div>
<?php
            foreach($st->_results as $result) {
                echo "<div class=\"clientGenInfos\">
                        <div><b>".substr($result->date, 0, 10)."</b> / ".substr($result->date, 10)."</div>
                        <div>".$result->concessionnaire."</div>
                        <div>".$result->client."</div>
                        <div>".$result->voiture."</div>
                        <div>".$result->prix."</div>";

                        if ($result->statut == 'En Attente') {
                            echo '<div class="enAttente"><span>En Attente</span></div>';
                        } else if ($result->statut == 'Accepter') {
                            echo '<div class="accepter"><span>Accepter</span></div>';
                        } else if ($result->statut == 'Refuser') {
                            echo '<div class="refuser"><span>Refuser</span></div>';
                        }

                echo "  </div>
                ";
            }

        } else {
            echo '<div class="aucuneDemande">Nothing from now.</div>';
        }

    }
 ?>

然后是第二个块,几乎相同但在查询中有另一个表名。现在的问题是我的第二个表与第一个表具有相同的值。我被困在这里,在网上阅读的东西,没有关于这种情况。我还是PDO对象的新手!请帮忙!

编辑---

这是我的第二块......

    <?php 
    if ($st = DB::getInstance()->query("SELECT * FROM users WHERE users.group = 3 ORDER by date DESC")) {
        if ($st->count()) { ?>

            <div id="topSeparateurClientConc">
            <div>Pr&eacute;nom et Nom</div>
            <div>Adresse</div>
            <div>Nom d'utilisateur</div>
            <div>Date d'inscription</div>
            <div>Demandes re&ccedil;ues</div>
        </div>
        <div style="clear:both;"></div>
<?php
            foreach($st->_results as $result2) {
                echo "<div class=\"clientGenInfosConc\">
                        <div>".$result2->name."</div>
                        <div>".$result2->adresse."</div>
                        <div>".$result2->username."</div>
                        <div><b>".substr($result2->joined, 0, 10)."</b> / ".substr($result2->joined, 10)."</div>
                        <div>".$result2->concessionnaire."</div>
                    </div>";
            }
        } else {
            echo '<div class="aucuneDemande">Aucune demande transf&eacute;rable en ce moment</div>';
        }
    }
 ?>

1 个答案:

答案 0 :(得分:1)

不要编写自己的PDO包装器。周期。

PDO 已经一个包装器。由专业人士撰写。它有一些缺点,但至少它没有新手程序员引入数百个的有害功能。

如果你想要静态方法来获取实例 - 好吧,拥有它。但剩下的就是原始的PDO。 为自己保留一个函数调用并不值得与自己的包装器的谬误作斗争。

根本不保存电话!看看你在做什么:

<?php if ($st = DB::getInstance()->query("SELECT * FROM resum WHERE form_id = ? ORDER by date DESC", array(Input::get('formID')))) 

如果不滚动,甚至无法读取。你是否因为每一条额外的线路或罚款而被罚款? 这一行包含了近十几个运营商!

这称为&#34;只写&#34;风格。

你正在为自己节省一个换行速度以便写得更快,但是当它来到阅读时,你会在这里跑,哭泣&#34;为我读取我的代码!&#34; 。

  

Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.

特别是如果谁必须维护。看:

<?php 
$sql = "SELECT * FROM resum WHERE form_id = ? ORDER by date DESC";
$st = DB::getInstance()->query($sql, array(Input::get('formID')));
if ($st) 

人们可以阅读并理解它。没有人因为将这个电话分成四行而死亡。现在添加几个:

$sql = "SELECT * FROM resum WHERE form_id = ? ORDER by date DESC";
$st = DB::getInstance()->prepare($sql);
$st->execute(array(Input::get('formID')));
$data = $st->fetchAll();
if ($data) 

假设getInstance()返回原始PDO实例。而且你的代码将非常好用。

好吧,我能理解程序员避免重复的愿望。这是一个solution that solves this problem without drawbacks

$sql = "SELECT * FROM resum WHERE form_id = ? ORDER by date DESC";
$data = DB::prepare($sql)->execute(array(Input::get('formID')))->fetchAll();

然后退出在模板中编写SQL调用的想法。首先获取所有数据,然后包含带有标记的文件。

<?php if ($data): ?>
        <div id="topSeparateurClientConc">
        <div>Pr&eacute;nom et Nom</div>
        <div>Adresse</div>
        <div>Nom d'utilisateur</div>
        <div>Date d'inscription</div>
        <div>Demandes re&ccedil;ues</div>
    </div>
    <div style="clear:both;"></div>
<?php foreach($data as $result2): ?>
    <div class="clientGenInfosConc">