SQL Abfrage funktioniert in phpMyAdmin aber nicht im Script

C

Caspian DeConwy

Gast
Hi,

ich habe in einer MySQL-DB eine Tabelle mit einer Spalte artikelnummer, wobei jede Artikelnummer mit den Buchstaben LNC beginnt.

Bei einigen Zeilen fehlt die Artikelnummer, welche ich mir dann nicht ausgeben lassen möchte.

Wenn ich in phpMyAdmin diesen SQL-Code verwende, bekomme ich das gewünschte Resultat:
SQL:
SELECT * FROM preisliste_intern WHERE artikelnummer LIKE 'LNC%' ORDER BY artikelnummer ASC

Verwende ich den Code dann in meinem PHP-Script, erhalte ich ein leeres Ergebnis. Ohne die WHERE-Klausel wird die komplette Tabelle ausgegeben.
PHP:
$sql = sprintf("SELECT * FROM preisliste_intern WHERE artikelnummer LIKE 'LNC%' ORDER BY artikelnummer ASC");
$sql = mysqli_query($verbindung, $sql);
while($row = mysqli_fetch_object($sql))
{
  echo "...";
}
Die Artikelnummer ist vom Typ varchar(12). Was ist hier falsch?
 
Das sprintf.
Das erwartet eine Formatsequenz mit dem %.
Laß also sprintf weg oder steck das % in einen Parameter zu sprintf oder bau ein Escape drumrum.
 
  • Gefällt mir
Reaktionen: Phrasendreher
Wozu verwendest du sprintf? Lass dir doch mal $sql vorm Absetzen ausgeben. Weiterhin kannst du dir auch die Rückgabe von mysqli_query ansehen und ebenso mysqli_error im Falle eines Fehlers.

Bitte lies auch die Doku.
 
  • Gefällt mir
Reaktionen: BeBur
mysqli und co nutzt man auch nicht mehr, allein schon der Thematik mit SQL Injections wegen sollte man PDO und Prepared Statements nutzen....
 
Natürlich nutzt man noch mysqli. Das hat nichts mit weniger sicher zu tun. PDO ist eben auch mit anderen Treibern verwendbar, wohingegen mysqli auf mysql/mariadb zugeschnitten ist. Auch mit mysqli sind prepared statements möglich.
 
  • Gefällt mir
Reaktionen: bog
Bei jedem PHP/mySQL Thread frage ich mich, wie man sowas heutzutage noch benutzen kann. Es schüttelt mich jedes mal...
 
Weil es seit über 20 Jahren funktioniert, sich bewährt hat und immer noch geschätzt 90 % dieses "Internet" auf genau dieser Architektur aufgebaut sind?
Oder was glaubst du, womit das Forum XenForo hier läuft, in das ich gerade reintippe...
 
Ich weiß nicht, ob der Beitrag von parats auf speziell mysqli bezogen war, da würde ich zustimmen und sagen, dass man wohl eher PDO nutzen sollte für größere Anwendungen heutzutage. Für kleinere Skripte ist das aber völlig legitim.

Ich verstehe den Hass auf PHP nicht. PHP hat den Nachteil, dass es sehr einfach zugänglich war für z.B. Quereinsteiger, die dann dort schlechte Software entwickelt haben. In der Zwischenzeit hat sich aber einiges geändert und man kann PHP komplett objektorientiert und gut wartbar Programmieren.
 
ayngush schrieb:
Weil es seit über 20 Jahren funktioniert, sich bewährt hat und immer noch geschätzt 90 % dieses "Internet" auf genau dieser Architektur aufgebaut sind?
Oder was glaubst du, womit das Forum XenForo hier läuft, in das ich gerade reintippe...

Das etwas funktioniert ist kein Pluspunkt. Getreu dem Motto "kann man machen, ist dann halt scheiße". Prinzipiell finde ich die große Community und die vielen Hilfestellungen/Support super. Gerade für Einsteiger die erstmal anfangen wollen. PHP ist aber historisch gewachsen und schleppt eine Reihe von Problemen als legacy mit sich. Davon abgesehen schwirrt eben auch Jahrzehnte alter Code im Web umher und wird eben nicht einem refactoring unterzogen. Ich würde dir mal eine Reihe von Blogposts empfehlen die sich kritisch mit PHP und der Implementierung auseinandersetzen. Das hat btw nichts mit Hass zu tun, ich selbst schreibe seit mittlerweile 15 Jahren Software und lehne keine Sprache Grundsätzlich ab.
 
Zuletzt bearbeitet:
Tokolosh schrieb:
Ich weiß nicht, ob der Beitrag von parats auf speziell mysqli bezogen war, da würde ich zustimmen und sagen, dass man wohl eher PDO nutzen sollte für größere Anwendungen heutzutage. Für kleinere Skripte ist das aber völlig legitim.
Für größere Anwendungen nutzt man aber weitere Abstraktionen wie Doctrine DBAL oder eher ORMs wie Doctrine, Eloquent, Redbean, Propel und Co. Und die können durchaus wiederum ebenso mit PDO und/oder mysqli umgehen. Und selbst wenn du keine fertige Lib nutzt, solltest du trotzdem in deinem Code eine Abstraktion für konkrete Implementierungen vornehmen, sodass eben nicht so ein großes Problem wie bei der Migration von PHP 5 auf 7 mit der mysql Extension auftritt.

Der Vorteil von mysqli ist, dass man asynchrone Queries absetzen kann. Vorteil PDO, dass man mehrere Backends nutzen kann, sich dann aber trotzdem auf eine konkrete Implementierung beruft (Postgres hat ja andere Features als MySQL). Man müsste beim Einsatz der PDO also konkret auch unterschiedliche Queries schreiben, sonst bringt einen die Abstraktion im Treiber gar nichts und du hast trotz PDO ne feste Bindung zu Postgres oder MySQL oder MSSQL oder oder...
Tokolosh schrieb:
Ich verstehe den Hass auf PHP nicht. PHP hat den Nachteil, dass es sehr einfach zugänglich war für z.B. Quereinsteiger, die dann dort schlechte Software entwickelt haben. In der Zwischenzeit hat sich aber einiges geändert und man kann PHP komplett objektorientiert und gut wartbar Programmieren.
So weit würde ich gar nicht gehen. Das Problem ist sicherlich die Sprache selbst in der Vergangenheit. Ein entscheidenes Kriterium sind aber auch die erheblich schlechten Tutorials (bspw. SQL-Injection). Ein weiterer Faktor sind dann aber auch Code-Monkeys, die ihr Mantra "hab ich schon immer so gemacht" oder "ich mach das mal schnell" hoch halten. Entsprechend hundsmiserabel sieht die Codebase dann eben auch aus und bei jedem neuen Feature muss alles immer wieder neu geschrieben werden, weil es nirgendwo Abstraktion gibt, sondern alles konkret gegen eine Lib gebaut wurde.

Naja, das unterscheidet dann halt nen guten von nem schlechten Entwickler. Allerdings ist der Wildwuchs dann natürlich trotzdem entsprechend gruselig und der nächste gute Entwickler sitzt dann tagelang mit nem Facepalm vorm Bildschirm, weil die Code entsprechend schlecht ist.

Ich musste mal Prestashops eBay Modul anpassen... 🤢 Die Kommentare in Französisch haben mir bei Problemen wunderbar geholfen!
 
Würde halt empfehlen Programmiersprachen nicht zur Religion zu erklären, sondern mit technischen Fakten an das Thema heran zu gehen. Und da schaut PHP 7.3 im Vergleich überhaupt nicht schlecht aus.
Das viele Entwickler halt einfach schlechte Programmierer sind, die keinen Deut auf moderne Architekturempfehlungen, bewährte Paradigmen geben und nichts über die Veränderungen in dessen Zielsprache wissen und sich auch nicht fortbilden ist ein generelles und kein sprachspezifisches Problem.
Das Höre ich aus Behörden über Java und C++-Entwickler vom Kumpel genau so, wie die Hater es ins Netz über PHP schreiben usw.

Auch in C++ und in Java und ASP.net kann man wunderbar SQL-Injections schreiben, wenn man faul oder doof oder beides ist. Das hat doch mit der Sprache nichts zu tun.

Also bitte, lasst das Spirituelle dabei außen vor.
 
ayngush schrieb:
Auch in C++ und in Java und ASP.net kann man wunderbar SQL-Injections schreiben, wenn man faul oder doof oder beides ist. Das hat doch mit der Sprache nichts zu tun.
Natürlich nicht. Aber irgendwie ist in anderen Sprachen der "Zwang" das Richtige zu tun höher. Dort werden Prepared Statements eben immer eingesetzt. Warum also wird/wurde nur in PHP Tutorials solcher Blödsinn veranstaltet? Kann es mir nur mit unerfahrenen Entwicklern und "läuft doch" erklären.
 
Ein Prepared Statement hat nichts damit zu tun, dass es keine SQL-Injections mehr gibt. Die Leute sind auch in C++ so bescheuert

C++:
prep_stmt = con->prepareStatement("INSERT INTO test(id, label) VALUES ("+ myID +", '"+ myLabel +"')");
prep_stmt->execute();

zu schreiben.

Und warum? Weil geht doch. Weil viele einfach keine Ahnung von SQL / Datenbanken haben. Weil viele einfach keine Ahnung von Security haben. Weil das "funktioniert" wichtiger ist als die Qualität. (was übrigens mit dem ganzen falsch verstandenen "agile" & CI/CD neuen Forttrieb bekommt). Weil viele auch kein Ops-Denken haben und von Ops keine Ahnung haben und sich nicht in das Gesamtbild reindenken können.

Bei einigen "PHP-Tutorials" vermute ich jedoch schon eine zynisch böse Absicht.
 
Zuletzt bearbeitet:
Zurück
Oben