Datenbank(sqlite) wird nicht ausgelesen:helpnew

  • Hallo community,
    nachdem ich in meinem soeben erledigten thread endlich eine Verbindung zur Datenbankanbindung

    PHP
    echo" Datenbank erfolgreich initialisert";[/php] einrichten konnte, werden mir die Daten allerdings nicht ausgelesen. Ein cat der error.log ergab folgende Fehlermeldung:
    [code]2017-01-07 13:39:52: (mod_fastcgi.c.2702) FastCGI-stderr: PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1 no such table: plz' in /home/pi/PDO_Connect.php:93
    2017-01-07 13:39:52: (mod_fastcgi.c.2702) FastCGI-stderr: Stack trace:
    2017-01-07 13:39:52: (mod_fastcgi.c.2702) FastCGI-stderr: #0 /home/pi/PDO_Connect.php(93): PDO->query('SELECT stadt,pl...')
    2017-01-07 13:39:52: (mod_fastcgi.c.2702) FastCGI-stderr: #1 {main}
    2017-01-07 13:39:52: (mod_fastcgi.c.2702) FastCGI-stderr:   thrown in /home/pi/PDO_Connect.php on line 93


    Der Clou daran ist, dass dasselbe Skript mit $databasetyp = "mysql"; als einzige Abwandlung mit einer identischen Tabelle (zumindest was die Entinitäten,Attribute etc. angehen) reibungslos funktioniert. Insofern ist das Posten des Quellcodes wohl weniger wichtig [kann ich aber ggf. nachholen,sofern erwünscht!]
    Dasselbe query in phpliteadmin gibt die gewünschten Datensätze aus. Die Tabelle 'plz' exisitert folglich. Warum also obige Fehlermeldung?
    Vor allem macht mich stutzig, dass in obiger Fehlermeldung die Tabelle als plz' bezeichnet wird, obgleich das query wie folgt formuliert wurde:

    Code
    $sql = "SELECT stadt,plz FROM plz WHERE stadt LIKE '".$_POST["anfang0"]."%' ORDER BY stadt";

    vorab vielen Dank für jede Hilfestellung, die dazu führt, das Problem zu lösen :helpnew:

    Edited once, last by tklustig (January 7, 2017 at 3:18 PM).

  • Die Fehlermeldung sagt recht klar, dass es die Tabelle *NICHT* gibt. Da SQLITE beim oeffnen einer Datenbank normalerweise einfach einen neue, leere DB anlegt, wenn die Datei noch nicht existiert, vermute ich mal, dass du ein Pfadproblem hast. Du musst die exakt gleichen Pfade bei phpliteadmin und deinem Skript verwenden.


  • Die Fehlermeldung sagt recht klar, dass es die Tabelle *NICHT* gibt. Da SQLITE beim oeffnen einer Datenbank normalerweise einfach einen neue, leere DB anlegt, wenn die Datei noch nicht existiert, vermute ich mal, dass du ein Pfadproblem hast. Du musst die exakt gleichen Pfade bei phpliteadmin und deinem Skript verwenden.


    Und wie mache ich das?
    Pfadangaben kann ich nirgends einstellen. phpliteadmin liegt in genau denselbem Verzeichnis wie alle anderen Dateien auch. Und die Verbindung zur Datenbank klappt bekanntlich.
    Wo also kann ich Pfadangaben ggf. korrigieren, sollte es daran liegen....

  • Quote


    Und bei SQlite ist das eine Datei, auf die PHP per Datenbank-Befehlen zugreifen darf.
    Hast du die entsprechend definiert?


    Nein, habe ich nicht.
    Wie heist die und wie konfiguriere bzw. definiere ich die, damit der Zugriff auf SQlite per php funktioniert.

    Allerdings:

    phpliteadmin greift letztlich auch nur via php auf SQlite zu, und da funktioniert, wie bereits erwähnt, das Query.
    Wo also ist jetzt, -die erwähnte Konfiguration bzw. Definierung betreffend - der Unterschied bzgl phpliteadmin und meinem Skript?
    Anbei noch der Quellcode:
    [code=php]<?php
    $user = "root"; // DB-Parameter definieren...
    $pw = "";
    $databasename = "plz";
    $databasetyp = "sqlite";
    $hostname="localhost";
    try {$dbh = new PDO("$databasetyp:host=$hostname;dbname=$databasename;charset=utf8",$user,$pw,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); // DB-Aufbau objektorientiert
    echo"Verbindung initialisiertt";
    }catch(PDOException $e) {
    print "Error!: " . $e -> getMessage() . "<br>";} // sofern kein Aufbau möglich interne Fehlermeldung ausgeben
               
    //PLZ nach Eingabe des Ortes
    if(!empty($_POST["search0"]) && $_POST["search0"] == "Suchen") {

    $sql = "SELECT stadt,plz FROM plz WHERE stadt LIKE '".$_POST["anfang0"]."%' ORDER BY stadt";

    //$sql = "SELECT * FROM `plz` where ort like '".mysql_real_escape_string($_POST["anfang"])."%' order by plz asc";

    $treffer=$dbh->query($sql); // obejektorientierte Abfrage definieren
    print "<br><b><font size='5'><font color='#ff00ff'>Es wurden ".$treffer->rowCount()." Datensätze gefunden</b></font size></font><br><br>";
    echo"<table border='3'>";
    echo"<tr><td width='60' bgcolor=red>PLZ</td><td width='157' bgcolor=yellow>Ort</td></tr>";

    if ($treffer){ //sofern Datensätze vorhanden
    foreach ($treffer as $daten) { //Datensätze in Tabellenform auslesen
    echo"<table border='1'>";
    echo "<tr><td width='60' bgcolor=red>".$daten['plz']."</td><td width='160' bgcolor=yellow>".$daten['stadt']."</td></tr></table>";}
    }
    else echo "<p>Keine Datensätze vorhanden</p>"; //sofern keine Datensätze vorhanden
    }


    //Ort nach Eingabe der PLZ
    if(!empty($_POST["search1"]) && $_POST["search1"] == "Suchen") {

    $sql = "SELECT plz,stadt from plz where plz like '".$_POST["anfang1"]."%' order by plz asc";

    //$sql = "SELECT * FROM `plz` where ort like '".mysql_real_escape_string($_POST["anfang"])."%' order by plz asc";
    $treffer=$dbh->query($sql); // obejektorientierte Abfrage definieren
    print "<br><b><font size='5'><font color='#ff00ff'>Es wurden ".$treffer->rowCount()." Datensätze gefunden</b></font size></font>";
    //echo"</font size></font>";

    echo"<br><br>";
    echo"<table border='3'>";
    echo"<tr><td width='60' bgcolor=red>PLZ</td><td width='157' bgcolor=yellow>Ort</td></tr>";

    if ($treffer){ //sofern Datensätze vorhanden
    foreach ($treffer as $daten) { //Datensätze in Tabellenform auslesen
    echo"<table border='1'>";
    echo "<tr><td width='60' bgcolor=red>".$daten['plz']."</td><td width='160' bgcolor=yellow>".$daten['stadt']."</td></tr></table>";}
    }
    else echo "<p>Keine Datensätze vorhanden</p>"; //sofern keine Datensätze vorhanden
    }
    ?>
    <script></script><!-- Hier ggf. JS-Code einfügen -->
    </body>
    </html>
    [/php]

    Edited once, last by tklustig (January 8, 2017 at 1:45 PM).

  • Vielen Dank auch für die wirklich plausiblen Lösungsvorschläge......
    und das ist jetzt tatsächlich 'ma ironisch gemeint :wallbash:

    Letztlich war die Lösung sooooo einfach:
    [code=php]<?php
    $db = new SQLite3("plz");
    $res = $db->query("select * from plz");
    while ($dsatz = $res->fetchArray(SQLITE3_ASSOC))
    {
    echo $dsatz["plz"];
    echo " ";
    echo $dsatz["Stadt"];
    echo " ";
    echo "<br>";
    }
    $db->close();
    ?>[/php]

    Was jetzt allerdings der Unterschied zwischen dieser und der anderen Lösung erschließt sich mir nicht!
    Die Datenbankverbindung wurde letztlich auch in der ersten Variante erfolgreich aufgebaut.....
    Nur die Tabellen wurde nicht erkannt, was a priori unsinnig ist;
    aber egal, hat mich schon genug graue Haare gekostet, den Fehler zu finden.
    Jetzt muss noch ein letztes Problem gelöst werden. Das aber poste ich in einem neuen thread!

    Edited once, last by tklustig (January 8, 2017 at 2:09 PM).

  • "SELECT *" ist nicht so toll.. Du weißt doch welche Spalten deine Tabelle hat und welche du gebrauchen kannst - also wähle die auch aus!

    Desweiteren: Absoluter Pfad zur Datenbankdatei !

    Ist heute Thema des Tages: Absoluter Pfad


    PS: Bist du sicher das deine Datenbank "plz", deine Tabelle "plz" und auch noch mal die Spalte "plz" lautet? Wenn ja dann ist das eine horror-struktur!

  • PS: Bist du sicher das deine Datenbank "plz", deine Tabelle "plz" und auch noch mal die Spalte "plz" lautet? Wenn ja dann ist das eine horror-struktur!

    Yuup:
    Datenbank:plz
    Tabelle.plz
    Spalte:plz ....alles so vorhanden. Das Problem liegt v.a. darin(das werde ich allerdings in einem neuen thread posten), dass ich nicht weiß, wie ich große Datenbanken importieren kann. Was phpmyadmin problemlos bewerkstelligt, schafft phpliteadmin nicht!
    Hier noch der Code;
    [code=php]<!Doctype html> <!-- Definition des doctype-Modus -->
    <html> <!-- Definition des Stammverzeichnises -->

    <head> <!-- Definition des Kopfbereiches -->

    <meta charset="utf-8"> <!-- charset[utf-8:] definiert den deutschen Zeichensatz -->
    <title>Datenbankabfragen</title> <!-- weist dem HTML-Dokument in der Registerkarte einen Namen zu -->
    <!-- Hier ggf. CSS-Link einfügen, z.B.: <link href="css/selektoren.css" rel="stylesheet"> -->


    <style>

    body{background-color:#81F7F3;}

    a:visited{color:blue}

    p{font-size:22px;}

    label{
    font-size:21px;
    border-bottom: double 4px;}

    label.l1{font-size:16px;}

    .button{
    height:50px;
    width:80px;
    background-color: #4CAF50;
    border: none;
    color: yellow;
    font-size: 15px;
    border-radius: 20px;}
       
    .button1{
    height:30px;
    width:50px;
    background-color: blue;
    border: none;
    color: yellow;
    font-size: 15px;
    border-radius: 10px;}
       
    .feld{
    background-color:#F6CEF5;
    border: none;
    color: brown;
    padding: 15px;
    text-align: center;
    font-size: 20px;
    border-radius: 8px;}

    #box1 {float:left;}
       
    </style>
    </head>
    <body> <!-- Definition des Bodybereiches -->
    <a href="index.html" target="blank">zurück zur Hauptseite</a>
    <center><h1>PDO-Abfragen/Postleitzahlenskript</h1></center><br>
    <p><i>Diese Webseite sucht in einer lokalen Datenbank nach der PLZ oder dem Ort Ihrer Wahl!</p>
    <p>In den dafür vorgesehenen gelben Feldern können Sie jeweils eintragen, wonach Sie suchen. Dafür genügen auch die Anfangsbuchstaben bzw. Anfangsziffern !!</p></i><br><br>
    <form action= "PDO_Connect.php" method="post">

    <div id="box1" class="box1">
    <input class="button1" type="submit" name="search_reset" value="Reset">
    <label name="ort">Suche bereinigen</label></div><br><br>
    <center>

    <input type class="feld" type="text" name="anfang0" id="anfang" placeholder="entweder hier Ort eintragen">
    <input class="button" type="submit" name="search0" value="Suchen"><br><br>

    <input type class="feld" type="text" name="anfang1" id="anfang1" placeholder="oder hier PLZ eintragen">
    <input class="button" type="submit" name="search1" value="Suchen"><br><br><br>

    </form>
    </center>
       
    <?php

    try{$dbh = new SQLite3("plz");
    echo "Datenbankverbindung initialisiert.....<br>";}
    catch(Exception $e) {
    print "Datenbankverbindungsfehler: " . $e -> getMessage() . "<br>";} // sofern kein Aufbau möglich interne Fehlermeldung ausgeben
               
    //PLZ nach Eingabe des Ortes
    if(!empty($_POST["search0"]) && $_POST["search0"] == "Suchen") {

    echo"<table border='3'>";
    echo"<tr><td width='60' bgcolor=red>PLZ</td><td width='157' bgcolor=yellow>Ort</td></tr>";

    $sql = $dbh->query("SELECT Stadt,plz FROM plz WHERE Stadt LIKE '".$_POST["anfang0"]."%' ORDER BY Stadt");
    $rows=$sql->numColumns();// liefert nur die Spaltenanzahl; die Methode numRows() existiert in dieser Klasse nicht!!
    print "<br><b><font size='5'><font color='#ff00ff'>Es wurden ".$rows." Datensätze gefunden</b></font size></font><br><br>";
    while ($daten = $sql->fetchArray(SQLITE3_ASSOC)){
    echo"<table border='1'>";
    echo "<tr><td width='60' bgcolor=red>".$daten['plz']."</td><td width='160' bgcolor=yellow>".$daten['Stadt']."</td></tr></table>";}
           
    //$db->close();
    }
    //Ort nach Eingabe der PLZ
    if(!empty($_POST["search1"]) && $_POST["search1"] == "Suchen") {

    $sql = $dbh->query("SELECT Stadt,plz FROM plz WHERE plz LIKE '".$_POST["anfang1"]."%' ORDER BY plz asc");

    while ($daten = $sql->fetchArray(SQLITE3_ASSOC)){
    echo"<table border='1'>";
    echo "<tr><td width='60' bgcolor=red>".$daten['plz']."</td><td width='160' bgcolor=yellow>".$daten['Stadt']."</td></tr></table>";}
    }

    ?>
    <script></script><!-- Hier ggf. JS-Code einfügen -->
    </body>
    </html>[/php]


    vielleicht kannst du mir bei meinem neuen thread auch behillich sein?

  • Wie gesagt, eine solche Struktur ist Horror.
    In der Datenbank hast du hoffentlich mehr als nur eine Tabelle und in der "plz" Tabelle hast du offensichtlich mehr als nur eine Spalte - also wäre es Sinnvoll die Datenbank dem Einsatz entsprechend besser zu benennen und die Tabelle verallgemeinert seines Inhaltes.

    Was phpmyadmin problemlos bewerkstelligt, schafft phpliteadmin nicht!

    phpmyadmin macht das auch nicht da PHP ein allgemeines Datei Limit von 2MB hat. Erst wenn du das explizit verstellst kannst du auch *.sql Dateien > 2MB hochladen und via phpmyadmin importieren... http://php.net/manual/en/ini.core.php#ini.sect.file-uploads
    Aber normalerweise macht man das auch nicht über WebOberflächen sondern über die Konsole (Shell).

    Was ich auch ein wenig als Horror betrachte ist deine art zu programmieren.. Der Code ließt sich extrem mühsam, mal keine Leerzeichen wo man aber normal welche setzt, mal Einrückungen mal keine etcpp

    Ich verweise auch noch mal auf eine meiner Antworten aus einem anderen Thread:

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!