Frage

Ich bin langsam alle meine LAMP websites von mysql_ Funktionen bewegen Funktionen PDO und ich habe meine erste Mauer getroffen. Ich weiß nicht, wie durch Ergebnisse mit einem Parameter-Schleife. Mir geht es gut mit den folgenden:

foreach ($database->query("SELECT * FROM widgets") as $results)
{
   echo $results["widget_name"];
}

Allerdings, wenn ich will, so etwas tun:

foreach ($database->query("SELECT * FROM widgets WHERE something='something else'") as $results)
{
   echo $results["widget_name"];
}

Offensichtlich ist die 'etwas anderes' wird dynamisch sein.

War es hilfreich?

Lösung

Hier ist ein Beispiel PDO für die Verwendung mit einem DB zu verbinden, um es zu sagen Ausnahmen anstelle von PHP-Fehlern zu werfen (mit Ihrem Debug-Hilfe) und unter Verwendung parametrisierte Anweisungen statt Ersetzen dynamische Werte in die Abfrage selbst (sehr empfehlenswert ):

// $attrs is optional, this demonstrates using persistent connections,
// the equivalent of mysql_pconnect
$attrs = array(PDO::ATTR_PERSISTENT => true);

// connect to PDO
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password", $attrs);

// the following tells PDO we want it to throw Exceptions for every error.
// this is far more useful than the default mode of throwing php errors
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// prepare the statement. the place holders allow PDO to handle substituting
// the values, which also prevents SQL injection
$stmt = $pdo->prepare("SELECT * FROM product WHERE productTypeId=:productTypeId AND brand=:brand");

// bind the parameters
$stmt->bindValue(":productTypeId", 6);
$stmt->bindValue(":brand", "Slurm");

// initialise an array for the results 
$products = array();
if ($stmt->execute()) {
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $products[] = $row;
    }
}

// set PDO to null in order to close the connection
$pdo = null;

Andere Tipps

Nach dem PHP-Dokumentation ist sagt Sie in der Lage sein sollte, folgendes zu tun:

$sql = "SELECT * FROM widgets WHERE something='something else'";
foreach ($database->query($sql) as $results)
{
   echo $results["widget_name"];
}

Ich bin kein Experte, aber das sollte funktionieren.

Wenn Sie die foreach-Syntax möchten, können Sie die folgende Klasse verwenden:

// Wrap a PDOStatement to iterate through all result rows. Uses a 
// local cache to allow rewinding.
class PDOStatementIterator implements Iterator
{
    public
        $stmt,
        $cache,
        $next;

    public function __construct($stmt)
    {
        $this->cache = array();
        $this->stmt = $stmt;
    }

    public function rewind()
    {
        reset($this->cache);
        $this->next();
    }

    public function valid()
    {
        return (FALSE !== $this->next);
    }

    public function current()
    {
        return $this->next[1];
    }

    public function key()
    {
        return $this->next[0];
    }

    public function next()
    {
        // Try to get the next element in our data cache.
        $this->next = each($this->cache);

        // Past the end of the data cache
        if (FALSE === $this->next)
        {
            // Fetch the next row of data
            $row = $this->stmt->fetch(PDO::FETCH_ASSOC);

            // Fetch successful
            if ($row)
            {
                // Add row to data cache
                $this->cache[] = $row;
            }

            $this->next = each($this->cache);
        }
    }

}

Dann, es zu benutzen:

foreach(new PDOStatementIterator($stmt) as $col => $val)
{
    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top