Frage

Bisher habe ich aber benutze PDO->bindParam während des manuell ich PDO->bindValue gefunden Lese von dem, was ich sagen kann PDO->bindValue nach Wert übergibt, wo als PDO->bindParam durch Verweis übergibt, dann ist dies der einzige Unterschied?

$modThread = db()->prepare("UPDATE `threads` SET `modtime` = UNIX_TIMESTAMP( ) WHERE `threadid` =:id LIMIT 1");

while(something)
{
        $modThread->bindParam(':id', $thread);
        $modThread->execute();
//*******************HERE********************//
}

erneut, während des manuell mir Lese gefunden: PDO->closeCursor soll ich es platzieren, wo markiert? Ist es optional / automatisch aufgerufen? Scheint nur bestimmte Treiber benötigen. Wird es auf einem Treiber aufrufen, die nicht brauchen nicht / unterstützen sie Fehler verursachen? Wie wäre es MySQL?

War es hilfreich?

Lösung

Die 'wiederkehrende' bindParam() hier ist nicht wirklich notwendig:

$thread = 0;
$modThread->bindParam(':id', $thread);

while($thread < 20)
{
    $thread++;
    $modThread->execute(); //executing with the new value, which you couldn't do with bindValue
}

Sie brauchen kein closeCursor(), wenn kein Suchresultates ist (das heißt, nur mit SELECT s oder Verfahren Ergebnisse zurück zu geben), aber in der Regel habe ich schon einen fetchAll irgendwo in einer früheren Aussage / Zeile durchgeführt.

Andere Tipps

Das ist nicht wahr. Wenn Sie sich Closecursor zu verwenden, benötigen, eine der optimalen Zeiten für insert / update / delete Befehle, und nur selten für SELECT-Anweisungen, für die Sie bereits abgerufenen Ergebnisse.

Zum Beispiel, wenn Sie alle Datensätze aus einer Tabelle auswählen, dann $ stmt- Ausgabe> fetch (), erreicht dies tatsächlich das Ziel für Closecursor sofort als die Zeilen sind nun nicht mehr in einem nicht abgerufene Status.

Aus dem Handbuch:

Diese Methode ist für Datenbanktreiber nützlich, die nicht unterstützen, ein PDOStatement Objekt ausgeführt wird, wenn ein zuvor PDOStatement ausgeführt Objekt noch nicht abgerufene Zeilen. Wenn Ihre Datenbanktreiber leiden unter dieser Einschränkung manifestieren kann das Problem selbst in einem Out-of-Sequenz-Fehlern.

Wenn Sie wirklich brauchen, ist Closecursor während einem der folgenden Fälle:

  • Wenn Ihr DB-Treiber erlaubt es nicht, für eine neue stmt ausgeführt werden, während nicht abgerufene Zeilen sind von der vorherigen ausführen
  • Sie haben mehrere vorbereitete Anweisungen und möchte sie ausführen ein After-andere ($ stmt1-> execute (); $ stmt-> Closecursor (); $ stmt2-> execute (); $ stmt2-> Closecursor ( ); $ stmt3 ... etc)
  • Sie haben mehrere stmts die insert / update ausführen muss / im gleichen Block löschen. Dies gilt, da, während Sie mysql Reihe Ergebnisse zurück nicht bekommen, Sie erhalten die Anzahl der betroffenen Zeilen führen Satz zurück (was immer noch ein Ergebnis ist).
  • Wenn Transaktionen mit
  • Wenn Sie ausgeben wollen wählen Stil-Anweisungen vorbereitet und führen sie, aber nicht die Daten abrufen, bis später

Wenn Sie brauchen nicht auf die Anweisung Closecursor:

  • Wenn Sie bereits die Zeilen geholt (wie bei $ stmt-> holen ()) vor der nächsten Anweisung ausgeführt werden soll. An diesem Punkt sind die Zeilen in einem „geholt“ Zustand und entlastet den Fahrer neue Anweisungen auszuführen.

Wie nützlich für einen Cursor zu schließen ist unset () (dh: unset ($ stmt)) und Einstellen der Erklärung auf null ($ stmt = null), das Öffnen der Türen für die Einbau-Garbage Collector klar alles oben .

finden Sie im Handbuch für weitere Informationen: http://php.net/manual/en /pdostatement.closecursor.php

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top