MySQL durchsuchen

  • Moin,

    ich versuche gerade die Spalte "id" in der Datenbank "$TableName" nach einem String (z.B. YA4592330054) zu durchsuchen. Ich weiß dass dieser String da ist, er findet ihn aber nicht. Was mache ich falsch? Finde dazu leider keine Antworten online. Ich weiß sicher, dass die Verbindung komplett funktioniert, weil wenn ich $result in einer vorherigen Version gezählt habe einfach "0" rauskam.

    Code
    $TableName = "`CoinTracker_DB`";
    $result = mysqli_query($conn, "SELECT id from $TableName, WHERE id='$q'"); //Ist IMMER false > Ungültige Suche?

    pasted-from-clipboard.png

    Vielleicht weil es den Suchbegriff mehrmals gibt?

  • Frei von einer anderen Plattform auf der man oft solche Fragen sieht:


    Warning: You are wide open to SQL Injections and should use parameterized prepared statements instead of manually building your queries. They are provided by PDO or by MySQLi. Never trust any kind of input! Even when your queries are executed only by trusted users, you are still in risk of corrupting your data. Escaping is not enough!

  • Aber das Komma ist definitiv fehl am Platze.

    Habe das mal entfernt. Hier mal die volle Funktion falls davor was falsch ist:

    Als Rückgabe erhalte ich:

    Zitat

    Found 0 rows. Does YA459233005 exist in database? true

    Was mir dabei noch auffällt, ist das das einsetzen von Sachen funktioniert (Wie man sieht), aber das erstellen von Datenbanken nur in PHP nicht, mit dem gleichen Befehl und manuell eingesetzten Werten in PHP MyAdmin funktioniert es. Das erstellen von Tabellen aus dem code heraus schlägt auch fehl, wenn die Datenbank komplett leer ist, also keine Tables existieren:

    Code
    $sql = "CREATE TABLE IF NOT EXISTS $TableName (
      `id` TEXT,
      `startplace` TEXT,
      `startcoords` TEXT,
      `firsttracked` TEXT,
      `lastseendate` TEXT,
      `lastseenplace` TEXT,
      `lastseencoord` TEXT,
      `worth` TEXT
    )";

    Frei von einer anderen Plattform auf der man oft solche Fragen sieht:


    Warning: You are wide open to SQL Injections and should use parameterized prepared statements instead of manually building your queries. They are provided by PDO or by MySQLi. Never trust any kind of input! Even when your queries are executed only by trusted users, you are still in risk of corrupting your data. Escaping is not enough!

    Damit muss ich mich noch befassen, allerdings stelle ich grade mein Plugin von einer CSV *hust* "Datenbank" auf MySQL um. Dafür sind alle Werte schon im Code generiert und mehrfach auf Gültigkeit geprüft (Habe dafür sogar eine eigene API gemacht xD). Werde mir das Thema trotzdem einmal angucken, ich bin mir ziemlich sicher dass ein Angreifer wenn er/sie nur will irgendeinen Bug finden wird der ein Workaround gibt. Nutze MySQLi dafür, wie benutze ich denn den builder dafür? Dumme Frage, ich weiß xD

  • Code
    $result = mysqli_query($conn, "SELECT id from $TableName WHERE id='$q'");
    mysqli_close($conn); //Disconnect
    echo "Found ".mysqli_num_rows($result)." rows. ";

    Offene nicht-persistente MySQL Verbindungen und Ergebnismengen werden bei der Beendigung der PHP-Skipt-Ausführung automatisch zerstört. Obwohl also das explizite Schließen von offenen Verbindungen und das Freigeben von Ergebnismengen optional ist, wird es dennoch empfohlen. Dadurch werden unmittelbar Ressourcen an PHP und MySQL zurückgeben, was die Performance verbessern kann. Weitere Information ist unter Freigeben von Ressourcen zu finden.

    Pack das close nach die Auswertung oder lass es weg. PHP macht die DB-Verbindung automatisch zu am Ende.


    Code
    $conn = new mysqli($DatabaseURL, $DatabaseUsr, $DatabasePass, $DatabaseName);

    Erstellt ein MySQLi-Objekt.

    Danach benutzt aber dauernd den prozeduralen Style:

    Code
    $result = mysqli_query($conn, "SELECT id from $TableName WHERE id='$q'");

    Ist mindestens ungewöhnlich. Ob es klappen kann, weiß ich nicht.



    Ansonsten dein Query als prepared Statement ( https://www.php.net/manual/de/…t.prepared-statements.php ). Pseudocode:

    Code
    $conn = new mysqli(/* connections details */);
    
    $stmt = $mysqli->prepare(sprintf('SELECT id FROM `%s` WHERE id=?', $TableName)); // wirklich nur wenn $TableName unbedingt dynamisch sein muss! Sonst am besten einfach den Table Name da reinschreiben...
    $stmt->bind_param("i", $q); // "i" heißt, dass es sich bei $q angeblich um einen integer halten soll
    $stmt->execute();
    $result = $stmt->get_result();
    
    var_dump($result->fetch_assoc());


    Nagel' mich nicht drauf fest, ist ein paar Jahre her, dass ich selber DB-Connections in PHP geöffnet habe.

  • Code
    $conn = new mysqli($DatabaseURL, $DatabaseUsr, $DatabasePass, $DatabaseName);

    Erstellt ein MySQLi-Objekt.

    Danach benutzt aber dauernd den prozeduralen Style...

    Ist mindestens ungewöhnlich. Ob es klappen kann, weiß ich nicht.

    Ja, stimmt.

    Es ist zumindest fraglich, ob man das Objekt so als Argument für die mysqli_query verwenden kann. (Versucht habe ich das noch nie. Auf die Idee bin ich noch nicht gekommen ;))

    Wenn schon Objekt, dann

    $conn->query( ... )

  • in dem Tutorial welches ich nutze und auf php.net kann man oft den Stil wechseln. Ich persönlich mag den Stil nicht, da ich eher aus der Richtung C / Java komme und daher so etwas einfach nicht verstehe und es auch so wie ich es schon habe geht. Ich persönlich finde den Stil unglaublich verwirrend, aber das ist ja jedem selber überlassen.

    Wie kommst du auf $mysqli? Ich habe die Variable nicht und wenn ich sie durch $conn ersetze hagelt es Fehler.


    Edit: Ich habe mir grade den Text noch einmal durchgelesen und gemerkt dass ich etwas aggressiv klinge, das war so nicht beabsichtigt :-/ (Warum kann man die Nase nicht weglassen... :I)

  • Wie kommst du auf $mysqli? Ich habe die Variable nicht und wenn ich sie durch $conn ersetze hagelt es Fehler.

    War ein Fehler in meinem Code. $conn ist richtig.

    Fehler sind doch gut. Dann weiß man wo man weitermachen muss. Allerdings nur, wenn du auch sagst welche :)


    Ich habe mir grade den Text noch einmal durchgelesen und gemerkt dass ich etwas aggressiv klinge, das war so nicht beabsichtigt

    Find ich nicht und ist auch eigentlich eher mein Stil

  • in dem Tutorial welches ich nutze und auf php.net kann man oft den Stil wechseln. Ich persönlich mag den Stil nicht, da ich eher aus der Richtung C / Java komme und daher so etwas einfach nicht verstehe und es auch so wie ich es schon habe geht. Ich persönlich finde den Stil unglaublich verwirrend, aber das ist ja jedem selber überlassen.

    Wie kommst du auf $mysqli? Ich habe die Variable nicht und wenn ich sie durch $conn ersetze hagelt es Fehler.


    Edit: Ich habe mir grade den Text noch einmal durchgelesen und gemerkt dass ich etwas aggressiv klinge, das war so nicht beabsichtigt :-/ (Warum kann man die Nase nicht weglassen... :I)

    Dann poste doch mal die Fehler hier, dann können wir dir weiterhelfen. Wenn es zu groß ist, benutze am besten pastebin oder sowas. Ich hab auch nochmal drüber geschaut und ein wenig was adaptiert und geändert. Probiere das mal:



    Ohne genaues Wissen über das DB Schema, können wir dir auch nur teilweise Beispiel-Code geben. Wenn du magst, kannst du mich gerne privat anschreiben wegen genaueren Infos, sollte es immer noch nicht klappen.

  • in dem Tutorial welches ich nutze und auf php.net kann man oft den Stil wechseln.

    Mag sein, dass man wechseln kann, aber ich würde davon abraten es zu mixen:

    Also entweder

    $conn = new mysqli(...)

    $result = $conn->query(...)


    oder

    $conn = mysqli_connect(...)

    $result = mysqli_query($conn, ...)


    aber nicht (wie bei dir)

    $conn = new mysqli(...)

    $result = mysqli_query($conn, ...)


    Ausprobiert habe ich das aber, wie gesagt, noch nie. ;)

    Kann also durchaus sein, dass es geht.

  • Dann poste doch mal die Fehler hier, dann können wir dir weiterhelfen. Wenn es zu groß ist, benutze am besten pastebin oder sowas. Ich hab auch nochmal drüber geschaut und ein wenig was adaptiert und geändert. Probiere das mal:



    Ohne genaues Wissen über das DB Schema, können wir dir auch nur teilweise Beispiel-Code geben. Wenn du magst, kannst du mich gerne privat anschreiben wegen genaueren Infos, sollte es immer noch nicht klappen.

    Habe das ganze mal probiert. Dabei kommt raus, dass $mysqli nicht definiert ist (Undefined variable: mysqli in blablabla/index.php on line 98). Habe es dann durch $conn ersetzt. Dann kriege ich: https://paste.helpch.at/ajezujexoy.sql

    Da sieht es so aus:

    pasted-from-clipboard.png

    Ich habe temporär alles nach Zeile 97 auskommentiert.

    Was mich zusätzlich wundert: Wenn ich

    SQL
    SELECT id FROM CoinTracker_DB WHERE id = YA459233005

    schreibe und es in PHP MyAdmin über die Konsole ausführe, kommt

    pasted-from-clipboard.png

    dabei raus. Kann es sein dass ich in der Hinsicht etwas falsch habe und nicht etwa die Suche ungültig ist?

    denke ich werde mich an der Stelle für die 2. Variante entscheiden. Nach wie vor wundert es mich dann aber, dass dieser Mix in einer anderen Funktion zu funktionieren scheint.


    Hoffe ich habe jetzt nichts vergessen, und vielen Dank für eure Hilfe bisher!

  • Habe es dann durch $conn ersetzt. Dann kriege ich: https://paste.helpch.at/ajezujexoy.sql

    Code
    Fatal error: Uncaught Error: Call to a member function bind_param() on bool

    $stmt (als Returnvalue von $conn->prepare() ) wird false, vermutlich weil die Verbindung zur Datenbank schon gar nicht aufgebaut werden kann.


    Ändere den Verbindungsaufbau mal so wie von Isaac geschrieben:

    Code
    $conn = new Mysqli(/* bla */);
    
    // Jetzt wird's wichtig:
    // Prüfen ob Verbindung aufgebaut. Wenn nicht, Fehler anzeigen
    if ($conn->connect_errno) {
        die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);
    }

    Dann wirst du beim Laden der Seite ein "Verbindung fehlgeschlagen" bekommen und dir wird auch ein Text angezeigt warum :)

  • Code
    Fatal error: Uncaught Error: Call to a member function bind_param() on bool

    $stmt wird false, vermutlich weil die Verbindung zur Datenbank schon gar nicht aufgebaut werden kann.


    Ändere den Verbindungsaufbau mal so wie von Isaac geschrieben:

    Code
    $conn = new Mysqli(/* bla */);
    
    // Jetzt wird's wichtig:
    // Prüfen ob Verbindung aufgebaut. Wenn nicht, Fehler anzeigen
    if ($conn->connect_errno) {
        die("Verbindung fehlgeschlagen: " . $mysqli->connect_error);
    }

    Dann wirst du beim Laden der Seite ein "Verbindung fehlgeschlagen" bekommen und dir wird auch ein Text angezeigt warum :)

    Jetzt bin ich vollends verwirrt. Wenn ich das hier mache:

    https://paste.helpch.at/kibokikagi.php


    Erhalte ich zurück:

    pasted-from-clipboard.png

    Variablen sind übrigens korrekt eingesetzt worden, da scheint nichts falsch zu sein.

  • Ok. Also er sagt: $statement->bind_param('i', $q);


    Dass bind_param() nicht auf eine bool augerufen werden kann. Also ist $statement false.

    Also geht hierbei etwas schief:

    Code
    $statement = $mysqli->prepare($sql);



    Hab den Fehler entdeckt. Das $q hat in $sql nicht zu suchen. Pack dort ein ? hin!

    Das ? wird später durch ->bind_param sicher mit $q ersetzt.


    Pack deinen Code bitte in ein Code Tag und nicht als Screenshot hier rein. Das macht's nur schwerer sowas zu finden.


    Alte Erwägungen:

  • Ich glaube wir sind etwas weiter!

    Mein Code (https://paste.helpch.at/yoxexotazu.php) gibt jetzt zwar einen kritischen Fehler zurück, aber ich denke trotzdem dass es geklappt hat. Denn jetzt habe ich:

    Fatal error: Uncaught Error: Object of class mysqli_result could not be converted to string.


    Wobei ich zurück erhalte:

    NULL (Ohne irgendwelche Kommentare oder mehr Text).