2011-03-19 23 views
6

Soy nuevo en PHP, así que no estoy exactamente seguro de cómo funciona.PHP - Almacenando mysql_fetch_assoc en una matriz multidimensional

De todos modos, alinearía para devolver una matriz multidimensional a otro método, esencialmente algo que almacena una pequeña cantidad de registros y columnas, estructura similar a una tabla.

He escrito lo siguiente, sin advertencia, pero no hay datos, ya sea

public function GetData($sqlquery) 
{ 
    include 'config.php'; 

    $result = mysql_query($sqlquery,$con); 
    $data = array(); 

    while($row = mysql_fetch_assoc($result)) 
    { 
     $data[] = $row; 
    } 

    return $data; 
} 

Lo más probable es hacer algo estúpido

Ayuda apreciado.

EDIT:

Gracias por todas las respuestas rápidas

me di cuenta de por qué esto no funcionaba, estaba dirigiendo a la matriz como tal

print $data[0][0]; 

En lugar de

print $data[0]['title']; 

por ejemplo, que ks todos :)

PS Realmente resulta difícil de creer que no se puede decir $ datos [0] [5], es más lógico OMI de especificar un valor de cadena para la ubicación

+0

Cómo se crea con $ en el config.php? – aorcsik

+0

¿Puedes decirnos qué es lo que está mal con este código? –

+0

¿Has leído las respuestas y corrige tus otros errores también? – markus

Respuesta

3

Su código parece estar bien. Al menos, vas en la dirección correcta.

Sólo algunas correcciones menores:

  • NUNCA incluyen config en el interior de una función. se debe hacer en el constructor de la clase
  • si realmente quiere usar el identificador de conexión - hacer que sea una variable de clase. Pero para la mayoría de las aplicaciones que utilizan una única conexión a db su innecesario el uso de $ con, por lo que se puede omitir
  • es absolutamente necesario manejo
  • error

así,

public function GetData($sqlquery) 
{ 
    $data = array(); 
    $result = mysql_query($sqlquery) or trigger_error(mysql_error().$sqlquery); 
    if ($result) 
    { 
     while($row = mysql_fetch_assoc($result)) 
     { 
      $data[] = $row; 
     } 
    } 
    return $data; 
} 

ejecutar este código y ver qué dice.

+0

Muchas gracias por sus consejos, aunque he resuelto el problema, me estaba dirigiendo a la matriz de forma incorrecta – Ash

0

Tal vez me equivoque Si todo esto sucede en config.php, pero creo que, yu pierdas unos pocos pasos:

Crear conexión:

$con = mysql_connect("localhost", "mysql_user", "mysql_password"); 

Seleccionar base de datos:

mysql_select_db("mydbname"); 

Después de esto, viene el mysql_query. Pero dices que no hay advertencias, así que supongo que haces todo esto.

me gustaría hacer algo como esto (hay mejores soluciones, más complejas):

include 'config.php'; // contains definition of $conf array 

$con = mysql_connect($conf['host'], $conf['user'], $conf['pass']); 
mysql_select_db($conf['db']); 

function GetData($sqlquery) 
{ 
    global $con; 

    $result = mysql_query($sqlquery,$con); 
    $data = array(); 

    while($row = mysql_fetch_assoc($result)) 
    { 
     $data[] = $row; 
    } 

    return $data; 
} 
1

Si utilizó la extensión mysqli en lugar de mysql, podría usar fetch_all() que es más rápido que llenar la matriz en un bucle. Por lo que su función sólo tiene que devolver el resultado de fetch_all()

return $result->fetch_all(MYSQLI_ASSOC); 

Guión

<?php 

ob_start(); 

try 
{ 
    $db = new mysqli("localhost", "foo_dbo", "pass", "foo_db", 3306); 

    if ($db->connect_errno) 
     throw new exception(sprintf("Could not connect: %s", $db->connect_error)); 

    $sqlCmd = "select * from users order by username"; 

    $startTime = microtime(true); 

    $result = $db->query($sqlCmd); 

    if(!$result) throw new exception(sprintf("Invalid query : %s", $sqlCmd)); 

    if($result->num_rows <= 0){ 
     echo "no users found !"; 
    } 
    else{ 

     $users = $result->fetch_all(MYSQLI_ASSOC); //faster 

     //while($row = $result->fetch_assoc()) $users[] = $row; //slower 

     echo sprintf("%d users fetched in %s secs<br/>", 
      count($users), number_format(microtime(true) - $startTime, 6, ".", "")); 

     foreach($users as $u) echo $u["username"], "<br/>"; 
    } 
    // $result->close(); 
} 
catch(exception $ex) 
{ 
    ob_clean(); 
    echo sprintf("zomg borked - %s", $ex->getMessage()); 
} 
//finally 
if(!$db->connect_errno) $db->close(); 
ob_end_flush(); 
?> 

Prueba

//fetch_all() 

1000 users fetched in 0.001462 secs 
5000 users fetched in 0.005493 secs 
15000 users fetched in 0.015517 secs 
50000 users fetched in 0.051950 secs 
100000 users fetched in 0.103647 secs 

//fetch_assoc plus loop 

1000 users fetched in 0.001945 secs 
5000 users fetched in 0.008101 secs 
15000 users fetched in 0.023481 secs 
50000 users fetched in 0.081441 secs 
100000 users fetched in 0.163282 secs 
+1

que es una prueba inútil. 0.0002 nunca será un cuello de botella. –

+0

¿dije que sería, o simplemente era más eficiente y elegante? –

+0

no hay mucha elegancia ya que el código estará oculto en el código de la función auxiliar. en cuanto a la eficiencia, no es tanto para darse cuenta. No debe usar esta función para procesar más de cien filas de todos modos –

Cuestiones relacionadas