2012-06-06 8 views
7

Llevo 2 meses estudiando PHP como mi primer lenguaje de scripting. Para la mayoría de mis problemas, puedo encontrar fácilmente una respuesta en línea, pero hay algo acerca de PDO que no puedo entender.Cómo se establece un resultado de PDO almacenado

Con el fin de recuperar datos de una base de datos instanciar un nuevo objeto de la clase PDO y llamar al método PDO :: query() en él. Esto devuelve un objeto PDOStatement que lleva el conjunto de resultados de la consulta SQL. Aquí es donde comienza el problema. Parece que no puedo entender cómo y dónde se almacenan los datos del conjunto de resultados.

En el Manual de PHP, aprendí a mostrar las filas devueltas por iterando sobre el objeto PDOStatement con un bucle foreach. Sin embargo, el manual de PHP establece claramente que si un objeto se convierte en una matriz, el resultado es una matriz cuyos elementos son las propiedades del objeto . La PDOStatement solo tiene una propiedad - $ queryString - que contiene la cadena de consulta emitida. Entonces ... ¿dónde están almacenados los resultados de la consulta? ¿Y por qué puedo llegar a ellos a través de una matriz con un ciclo foreach, pero no fuera de ella?

// Instantiate new PDO object to establish a new connection with MySQL database 
$db = new PDO('mysql:dbhost=localhost;dbname=world', 'root', 'secret'); 

// Execute SQL query - Returns a PDOStatement object 
$result = $db->query("SELECT Name, Continent, Population FROM Country"); 


// Result set can be accessed with a foreach loop iterating over the PDOStatement object 
foreach ($result as $row) { 
    echo "$row[Name] - $row[Continent] - $row[Population] <br />"; 
} 

// Outside the foreach loop, $result cannot be accessed this way. 
// This produces 'Cannot use object of type PDOStatement as array' 
echo $result[0]['Name']; 
+0

Implementa el [ 'Iterator'] (http: // php. net/Iterator), de modo que una llamada de método implícita devuelve los resultados individuales; para que no tengan que estar presentes como propiedades o datos internos. – mario

Respuesta

6

La clase implementa el PDOStatement Iterator interface, que permite a los objetos que se repitan ciertos través.

Iterator extends Traversable { 
    /* Methods */ 
    abstract public mixed current (void) 
    abstract public scalar key (void) 
    abstract public void next (void) 
    abstract public void rewind (void) 
    abstract public boolean valid (void) 
} 

Para un objeto que implementa la interfaz Iterator,

foreach($result as $row) { 
    // Code 
} 

es equivalente a

for ($result->rewind(); $result->valid(); $result->next()) { 
    $row = $result->current(); 
    // Code 
} 
+1

¡Muchas gracias! Me tomé el tiempo para aprender sobre SPL y la interfaz Iterator en particular. Ahora veo cómo es posible iterar sobre el objeto, pero sigo sin entender dónde se almacena el conjunto de resultados de la consulta. Aprendí que los objetos solo pueden tener tipos de miembros de árbol: propiedades, métodos y constantes. Si el conjunto de resultados no está almacenado en una propiedad, ¿dónde está almacenado? ¿Hay algún tipo de buffer? – user1440560

+0

Pregunta interesante. Esperaría que el objeto PDOStatement contenga un recurso, el mismo tipo de recurso que devuelve mysql_query. Sin embargo, de acuerdo con http://php.net/manual/en/class.pdostatement.php no es así. – ddlshack

+0

Además, mi respuesta fue un poco incorrecta. PDOStatement implementa directamente 'Traversable', que es una clase interna extendida por' Iterator'. – ddlshack

Cuestiones relacionadas