Frage von MaXXi1502, 64

php Fehler beim auslesen einer MySQL tabelle?

Hallo, ich möchte eine MySQL Tabelle ausgeben und nach verschiedenen Kriterien filtern. Allerdings bekomme Ich beim auslesen der Tabelle, trotz richtiger SQL abfrage immer nur ein leeres Array zurück. AM liebsten hätte ich die daten gerne so ausgegeben: Name - Typ - Adresse2

<?php
// Events in der Umgebung anzeigen lassen
include_once 'config.php';

// Überprüfen, ob die Anfrage von der App kommt, indem ein String von beiden Seiten geprüft wird
$validation_client = $_GET ['Validation'];

if (isset ( $validation_client ) and $validation_client == $validation_server) {

// Suchkriterien für Events
$Ort;
$Typ;
$Name;

// Anzahl der Elemente, die geliefert werden sollen
$Limit = $_GET ['Limit'];
    
// Überprüfen, welche Attribute gestetzt(Von der App übermittelt) wurden
// Und dementsprechende Abfrage specihern
    
if (isset ( $_GET ['Ort'] ) and isset ( $_GET ['Typ'] ) and isset ( $_GET ['Name'] )) {
    $Ort = $_GET ['Ort'];
    $Typ = $_GET ['Typ'];
    $Name = $_GET ['Name'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE Adresse2 = '$Ort'
            AND Typ = '$Typ' AND Name = '$Name' LIMIT $Limit";
    
    
    sendRequest ($statement);
} else if (isset ( $_GET ['Ort'] ) and isset ( $_GET ['Name'] )) {
    
    $Ort = $_GET ['Ort'];
    $Name = $_GET ['Name'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE Adresse2 = '$Ort'
            AND Name = '$Name' LIMIT $Limit";
    
    sendRequest ($statement);
} else if (isset ( $_GET ['Ort'] ) and isset ( $_GET ['Typ'] )) {
    
    $Ort = $_GET ['Ort'];
    $Typ = $_GET ['Typ'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE Adresse2 = '$Ort'
            AND Typ = '$Typ' LIMIT $Limit";
    
    sendRequest ($statement);
} else if (isset ( $_GET ['Typ'] ) and isset ( $_GET ['Name'] )) {
    
    $Typ = $_GET ['Typ'];
    $Name = $_GET ['Name'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE
            Typ = '$Typ' AND Name = '$Name' LIMIT $Limit";
    
    sendRequest ($statement);
} else if (isset ( $_GET ['Name'] )) {
    
    $Name = $_GET ['Name'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE
            Name = '$Name' LIMIT $Limit";
    
    sendRequest ($statement);
} else if (isset ( $_GET ['Typ'] )) {
    
    $Typ = $_GET ['Typ'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE
            Typ = '$Typ'LIMIT $Limit";
    
    sendRequest ($statement);
} else if (isset ( $_GET ['Ort'] )) {
    
    $Ort = $_GET ['Ort'];
    
    $statement = "SELECT Name, Typ, Adresse2 FROM Eventapp.Event WHERE Adresse2 = '$Ort'    LIMIT $Limit";
    
    sendRequest ($statement);
}
}

function sendRequest($var) {


$results = array();

//Alle betroffenen Daten auslesen
while ($row = mysql_fetch_row($var)) {
    $results[] = $row['Name'] . "  -  " . $row['Typ'] . "  -  " . $row['Adresse2']; 
}
echo json_encode($results);
}

?>
Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von PeterKremsner, 35

Versuch mal die Datenabfrage die dein Skript sendet per var_dump oder so auszugeben und Prüfe ob da wirklich eine Richtige Ausgabe kommt.

Wenn du phpmyadmin oder so auf dem Server hast, dann kopiere die Ausgabe deines PHP Skripts und führe die über Phpmyadmin als SQL Anfrage aus und schau nach ob da was zurück kommt.

Außerdem gibt es noch einen Fehler in deinem PHP:

  1. verwende mysqli und nicht mysql.
  2. mysqli_fetch_row braucht eine Resource als Argument du übergibst hier den SQL String.

Du musst den SQL String erst an die Datenbank senden zB mittels mysqli_query. Die Funktion gibt dir dann ein mysqli_result Objekt zurück und das kannst du jetzt als Argument für die Funktion mysqli_fetch_row verwenden.

Kommentar von MaXXi1502 ,

Also ich hab den String, der mit $var übergeben wird nochmals geprüft und der funktioniert auch. Ich habe zudem den Code, wie folgt geändert:

function sendRequest($var) {


echo $var;

$results = array();

$statement = mysqli_query($connection, $var);

//Alle betroffenen Daten auslesen
while ($row = mysqli_fetch_row($var)) {
$results[] = $row['Name'] .. $row['Typ'] . . $row['Adresse2'];
}
echo json_encode($results);
}

Allerdings bekomme ich immer noch nur [] zurück

Kommentar von PeterKremsner ,

Du musst mysqli_fetch_row($statement) schreiben, ansonsten übergibst du der Funktion wieder nur deinen SQL String.

Zudem ist die Variable $connection nicht definiert.

Dazu kannst du dir dieses Beispiel ansehen:

http://www.w3schools.com/php/func\_mysqli\_fetch\_row.asp

Kommentar von MaXXi1502 ,

$Connection war bereits weiter oben definiert, habs nur vergessen zu kopieren. aber geht immer noch nicht

function sendRequest($var) {


$connection = mysqli_connect("localhost", "seminar", "ty9dUB8sHtdJepsy", "Eventapp");

$results = array();

$statement = mysqli_query($connection, $var);

//Alle betroffenen Daten auslesen
while ($row = mysqli_fetch_row($statement)) {
$results[] = $row['Name'] . " - " . $row['Typ'] . " - " . $row['Adresse2'];
}
echo json_encode($results);
}
Kommentar von PeterKremsner ,

Ok dann aktiviere im php die Fehler Ausgabe und die Warnungen.

Zudem schau nach ob mysqli_query false zurückgibt.

Wenn ja dann lass dir den Fehler ausgeben und schreib ihn. Ohne Fehlermeldungen kann ich dir nicht mehr weiterhelfen.

Kommentar von MaXXi1502 ,

Also er sagt, dass 'Name', 'Typ' und 'Adresse2' nicht definiert sind

Kommentar von PeterKremsner ,

Alles klar dann schau dir mit var_dump mal das $row objekt an.

Btw hast du schon $statement geprüft ob das ungleich false ist?

Kommentar von maximilianus7 ,

$connection ist in der function nicht definiert:

global $connection;

tuts.

Kommentar von PeterKremsner ,

In der neuen Funktion die er gepostet hat ist es definiert.

Er macht zwar die Verbindung immer wieder neu auf aber funktionieren sollte es so auch.

Antwort
von RakonDark, 24

ich biete mal wieder gleich das PDO model an

https://github.com/sheinatz/tools/tree/master/download

dazu kommt natürlich das man eine GET variable sowieso so nicht benutz , das ist ein ganz großer Fehler .

hier mal mein komprimierter vorschlag um deine elseif weg zu bekommen


// https://github.com/sheinatz/tools/tree/master/download
include 'init.php'; // bitte die Daten anpassen .
// https://github.com/sheinatz/tools/tree/master/download
include 'database.php';

// Dein Programm
$gets = array('Ort'=>'Adresse2','Typ'=>'Typ','Name'=>'Name');

$Limit = "0,10";

$fields = array();
$wheres = array();
$values = array();

foreach ($gets as $get=>$field) {
if (isset ( $_GET[$get] )) {
$fields[] = $field;
$wheres[] = $field." = :$get ";
$values[":".$get]= $_GET[$get];
}
}
foreach
$sql = array("query"=>"SELECT ".implode(",", $fields)." FROM Eventapp.Event WHERE ".implode(" AND ",$wheres)." LIMIT $Limit",
"binds"=>$values;
);
try {
if ($anarray = getArraySQL($sql,$dbs)) {
foreach ($anarray as $arow) {
echo json_encode(implode('-',$arow));
}
} else { echo "keine Daten"; }
}
catch(PDOException $e) {
echo "Error Query the Database ".$e->getMessage();
}

ungetestet , sollte aber genau das machen


Kommentar von RakonDark ,

ffff


Kommentar von RakonDark ,

ein paar fehler haben sich eingeschlichen und das $_GET['Limit'] hab ich übersehen .

//  
include 'init.php'; // bitte die Daten anpassen .
//
include 'database.php';

// Dein Programm
$gets = array('Ort'=>'Adresse2','Typ'=>'Typ','Name'=>'Name');

$Limit = "0,10";

$fields = array();
$wheres = array();
$values = array();

foreach ($gets as $get=>$field) {
if (isset ( $_GET[$get] )) {
$fields[] = $field;
$wheres[] = $field." = :$get ";
$values[":".$get]= $_GET[$get];
}
}

if (isset($_GET['Limit'])) {$values[':limit']=>$_GET['Limit'];}

$sql = array("query"=>"SELECT ".implode(",", $fields)." FROM Eventapp.Event WHERE ".implode(" AND ",$wheres)." LIMIT :limit",
"binds"=>$values;
);

try {
if ($anarray = getArraySQL($sql,$dbs)) {
foreach ($anarray as $arow) {
echo json_encode(implode('-',$arow));
}
} else { echo "keine Daten"; }
}
catch(PDOException $e) {
echo "Error Query the Database ".$e->getMessage();
}




Kommentar von RakonDark ,

habs nochmal gepostet , die Zeit war hier mal wieder zu gering um schreibfehler zu löschen

Kommentar von RakonDark ,
/* database */
$dbs = array("dbi"=>NULL,
"host"=>"localhost",
"user"=>"test",
"pass"=>"test",
"db"=>"EventApp"
);

// Connect to Datenbank
$dbs['connect'] = 'mysql:host='.$dbs['host'].';dbname='.$dbs['db'].';charset=utf8';
$dbs['dbi'] = new PDO($dbs['connect'], $dbs['user'] , $dbs['pass']);
$dbs['dbi']->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbs['dbi']->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

// get multiple entry from db
function getArraySQL($sqla,&$dbs) {
$someEntry = false;
if (isset($sqla["binds"])) {
$stmt = $dbs['dbi']->prepare($sqla["query"]);
$stmt->execute($sqla["binds"]);
} else {
$stmt = $dbs['dbi']->prepare($sqla);
$stmt->execute();
}
if ($stmt->columnCount() > 0 ) {
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$someEntry = $rows ;
}
return $someEntry;
}

// Dein Programm
$gets = array('Ort'=>'Adresse2','Typ'=>'Typ','Name'=>'Name');

$fields = array();
$wheres = array();
$values = array();

foreach ($gets as $get=>$field) {
if (isset ( $_GET[$get] )) {
$fields[] = $field;
$wheres[] = $field." = :$get ";
$values[":".$get]= $_GET[$get];
}
}
$limit ="";
if (isset($_GET['Limit'])) {$values[':limit']=>$_GET['Limit']; $limit = ' Limit :limit';}

$sql = array("query"=>"SELECT ".implode(",", $fields)." FROM Event WHERE ".implode(" AND ",$wheres)." $limit",
"binds"=>$values;
);

try {
if ($anarray = getArraySQL($sql,$dbs)) {
foreach ($anarray as $arow) {
echo json_encode(implode('-',$arow));
}
} else { echo "keine Daten"; }
}
catch(PDOException $e) {
echo "Error Query the Database ".$e->getMessage();
}
Antwort
von RakonDark, 15

was mir noch auffällt ist das validation server , wohl besser mit session organisiert wird . ein GET kann jeder häcken :)

Kommentar von RakonDark ,

oh , es scheint eine app zu sein , darf nur keiner die app haben sonst liesst der das GET einfach mal aus und baut es selber .

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten