2017-03-08 3 views
2

Ich habe einen alten PHP-Code, der mysql enthält.PHP mysqli_fetch_assoc nicht tun korrekte Wert zurück

Er ruft ein Array aus einer SELECT-Anweisung ab, fügt es zu einem JSON-Objekt als Eigenschaft hinzu und gibt das codierte JSON wieder.

Ich habe es geändert, um mysqli zu verwenden, aber wenn ich versuche, die Zeilen zu erhalten und ein Array daraus zu erstellen, gibt es nichts zurück.

Hier ist der alte MySQL-Code:

$con = mysql_connect('host','account','password'); 
if (!$con) 
{ 
    //log my error 
}; 

mysql_select_db("database_name", $con); 
mysql_set_charset('utf8'); 
$sql = "SELECT field1 as Field1, field2 as Field2 from table where ID = '".$parameter."'"; 
$query = mysql_query($sql); 
$results = array(); 
while($row = mysql_fetch_assoc($query)) 
{ 
    $results[] = $row; 
} 
return $results; 

Version1: Hier ist die neue, die ich mit dem Schreiben versucht:

$con = mysqli_connect('host','account','password','database_name'); 
$sql = "SELECT field1 as Field1, field2 as Field2 from table where ID = '".$parameter."'"; 
$results = array(); 
if($result=mysqli_query($con, $sql)) 
{ 
    while ($row=mysqli_fetch_assoc($result)) 
    { 
     $results[] = $row; 
    } 
    return $results; 
} 
else 
{ 
    //error 
} 

Version2: Zweite, was ich versuchte, die nur 1 Zeile zurückgibt:

...same as above until $sql 
if($result=mysqli_query($con,$sql)) 
{ 
    $row=mysqli_fetch_assoc($result); 
    return $row; 
} 

Version3: Oder ich habe versucht, die mysql-Struktur wie folgt komplett zu spiegeln:

$sql = "SELECT ..."; 
$query = mysqli_query($con, $sql); 
$results = array(); 
while($row = mysqli_fetch_assoc($query)) 
{ 
    $results[] = $row; 
} 
return $results; 

Wrapping die resultierende Array in das JSON:

$obj = new stdClass(); 
$obj->Data = $results; 
$obj->ErrorMessage = ''; 
die(json_encode($obj)); //or echo json_encode($obj); 

Keine der mysqli-Version arbeiten, so dass ich dachte, es könnte diese Arrays erstellt eine wichtige Änderung in der Art und Weise sein.

Irgendwelche Tipps, was am ersten mysqli-Beispiel falsch sein könnte?

Mit Version2 kann ich sagen, dass die SQL-Verbindung da ist, und ich kann zumindest eine Zeile auswählen. Aber es ist offensichtlich nur eine Zeile, als es zurückgibt. Es macht mich denken, dass die Anordnung der Quelle des Problems ist, den Aufbau, oder es ist in Bezug auf das JSON-Objekt ...

SPÄTER EDIT: OK! Eine funktionierende Lösung gefunden.

AUCH, spielte ich mit den Daten herum, wählte einen kleineren Brocken, und es funktionierte plötzlich. Lektion daraus: Die Funktion reagiert nicht auf die gleiche Weise für 40 Zeilen oder für 5 Zeilen. Hat es etwas mit einer php.ini Einstellung zu tun? Oder könnte es illegale Charaktere in der Auswahl geben? Könnte es sein, dass die Länge einer "Note" -Spalte (von der db) zu lang ist, als dass das Array es könnte?

Hier ist der Arbeitsabschnitt des Codes, der einige Zeilen aus der Datenbank auswählt, sie in ein Array einfügt und dann dieses Array in ein Objekt einfügt, das am Ende in JSON kodiert ist, mit einer Statusmeldung daneben. Könnte verbessert werden, aber das ist nur für Demo.

$con = mysqli_connect('host','username','password','database_name'); 
if (!$con) 
{ 
    $errorMessage = 'SQL connection error: '.$con->connect_error; 
    //log or do whatever. 
}; 
$sql = "SELECT Field1 as FieldA, field2 as FieldB, ... from Table where ID='something'"; 

$results = array(); 

if($result = mysqli_query($con, $sql)) 
{ 
    while($row = mysqli_fetch_assoc($result)) 
    { 
     $results[] = $row; 
    } 
} 
else 
{ 
    //log if it failed for some reason 
    die(); 
} 

$obj->Data = $results; 
$obj->Error = ''; 
die(json_encode($obj)); 

Frage ist: Wie kann ich das Problem in Bezug auf die Größe des Arrays/ungültige Zeichen überwinden (wenn das der Fall ist)?

+0

Wo sehen Sie '$ con' definieren? Ist es richtig verbunden? Was ist deine SELECT-Abfrage? Weißt du, dass das funktioniert? – Qirel

+0

Hallo! $ con ist der Verbindungshandler, und es funktioniert, wenn es zu diesem Punkt kommt. Das SELECT funktioniert auch, weil ich es ausprobiert habe und es dann in die MYSQL-Workbench eingefügt habe, und es scheint zu funktionieren. – Laureant

+0

Und wo ist dein mysqli_error()? Was ist der Fehler, den Sie bekommen? – user3526204

Antwort

1

Ihr "Version 1" scheint aus einer PHP-Perspektive korrekt zu sein, aber Sie müssen die Fehler tatsächlich behandeln - sowohl beim Verbinden als auch beim Ausführen der Abfrage. Wenn Sie dies tun würden, hätten Sie gesagt, dass Sie tatsächlich keine Tabelle abfragen. In der Abfrage fehlt FROM tablename.

Verwenden Sie mysqli_connect_error() beim Verbinden und mysqli_error($con) beim Abfragen, um die tatsächlichen Fehler zurück zu erhalten.Allgemeine PHP-Fehlerberichte könnten Ihnen ebenfalls helfen.

Der folgende Code geht davon aus, dass $parameter vor diesem Code definiert ist.

$con = mysqli_connect('host','account','password','database_name'); 
if (mysqli_connect_errno()) 
    die("An error occurred while connecting: ".mysqli_connect_error()); 

$sql = "SELECT field1 as Field1, field2 as Field2 
     FROM table 
     WHERE ID = '".$parameter."'"; 

$results = array(); 
if ($result = mysqli_query($con, $sql)) { 
    while ($row = mysqli_fetch_assoc($result)) { 
     $results[] = $row; 
    } 
    return $results; 
} else { 
    return mysqli_error($con); 
} 

Fehler reporing

Hinzufügen

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

am Anfang der Datei direkt nach <?php würden Sie ermöglichen, die PHP-Fehler zu erhalten.

HINWEIS: Fehler sollten nie in einer Live-Umgebung angezeigt werden, wie es von anderen ausgenutzt werden könnte. Während der Entwicklung ist es praktisch und erleichtert die Fehlersuche - aber es sollte niemals anders angezeigt werden.

Sicherheit

Sie auch darauf hingewiesen, dass dieser Code SQL-Injektion anfällig ist, und dass Sie parametrisierte Abfragen mit Platzhalter verwenden, um sich dagegen zu schützen. Der Code würde wie folgt aussehen mit mit Prepared Statements:

$con = mysqli_connect('host','account','password','database_name'); 
if (mysqli_connect_errno()) 
    die("An error occurred while connecting: ".mysqli_connect_error()) 

$results = array(); 

if ($stmt = mysqli_prepare("SELECT field1 as Field1, field2 as Field2 
          FROM table 
          WHERE ID = ?")) { 
    if (mysqli_stmt_bind_param($stmt, "s", $parameter)) { 
     /* "s" indicates that the first placeholder and $parameter is a string */ 
     /* If it's an integer, use "i" instead */ 
     if (mysqli_stmt_execute($stmt)) { 
      if (mysqli_stmt_bind_result($stmt, $field1, $field2) { 
       while (mysqli_stmt_fetch($stmt)) { 
        /* Use $field1 and $field2 here */ 
       } 
       /* Done getting the data, you can now return */ 
       return true; 
      } else { 
       error_log("bind_result failed: ".mysqli_stmt_error($stmt)); 
       return false; 
      } 
     } else { 
      error_log("execute failed: ".mysqli_stmt_error($stmt)); 
      return false; 
     } 
    } else { 
     error_log("bind_param failed: ".mysqli_stmt_error($stmt)); 
     return false; 
    } 
} else { 
    error_log("prepare failed: ".mysqli_stmt_error($stmt)); 
    return false; 
} 

Referenzen

Verwandte Themen