PHP Bei senden von $descript Inhalten kommt ein Mysql Fehler beim Senden an Datenbank ?

DualityMind

Lieutenant
Registriert
Dez. 2015
Beiträge
768
Hallo

Ich habe wieder ein kleineres Problem mit PHP, leider :-)!

Und zwar habe ich ein Formular wo ich Daten eingebe (z.B. Programme, Beschreibung, Hersteller etc...)!

Sobald ich es ausgefüllt habe und es exotische Zeichen wie " ' " enthalten sind, gibt es vor dem Eintrag in die MySQL Datenbank eine Fehler Meldung. Wenn ich alle komische Zeichen entferne, dann wird es auch in der Datenbank registriert.

Es gibt da einen Befehl dazu z.B. bevor er das $description absendet z.B.

$descript = strlen($descript) oder so ähnlich, wo er glaube die Sonderzeichen herausfiltert ?

Reicht es dann einen solchen Befehl zu machen, bevor es per "Update MSQL etc..." eingetragen wird ?

Habe viele Einträge zu machen und wenn jedes 2th mal ein Fehler kommt, dann habe ich dadurch doppelte Zeit und muss alles wieder neu Eintragen.

Ich hoffe es kann mir jemand zur Hand gehen, wäre sehr froh darüber!

Danke :-) !

LG
 
Hallo

@ayngush: Scheint nicht das richtige zu sein. Problem ist ja, dass wenn ein Sonderzeichen in der Beschreibung des Programms ist, dass es rausgefiltert werden sollte oder so in die Datenbank zu übertragen, damit kein MSQL-Fehler kommt.

Bei Prepared Statement werden ja nur die $Vorname etc... eingetragen ohne dabei zu kontrollieren, ob es Sonderzeichen hat, so wie ich es verstanden habe über Google. :-)

Es gibt irgendeinen Befehl dazu, z.B. strlen,strpos etc...! Finde es aber leider nicht.

Hoffe es kann mir jemand einen Denkanstoss geben. :-)!

LG

PS Trotzdem Danke für die schnelle Antwort :-().
Ergänzung ()

Hallo

Habe es nun glaube gefunden und zwar:

$descript = preg_replace ( '/[^a-z0-9 ]/i', '', $descript );

Werde es gleich Testen ob es funktioniert. Wenn nicht, dann schreibe ich nochmals. Es lag mir wie gesagt auf der Zunge wusste nur nicht wo Anfangen.

Hoffe es klappt :-)! Gute Nacht+++!

LG
 
Zuletzt bearbeitet:
Du musst die Sonderzeichen mittels Escape maskieren ...

Je nachdem wie Du die Verbindung zur Datenbank aufbaust gibt es dafür "mysqli_real_escape_string" bei MySQLi oder "quote" bei PDO.
 
Hallo

Anscheinend war der Befehl:

$descript = preg_replace ( '/[^a-z0-9 ]/i', '', $descript );

nicht richtig. Da er jetzt alle HTML Befehle anzeigt wie <font etc...!

Muss ich dann auf meinen Webserver und in der Datenbank wo die Beschreibung des Programms ist einstellen, dass es auch Sonderzeichen erlaubt ? Oder wie genau muss ich denn das machen ?

Werde mal versuchen in der Datenbank etwas umzustellen bei der Rubrik Beschreibung. Ich hoffe ich mache keinen Mist :-9.

LG
 
Sympton ist damit erstmal behoben, aber nicht die Ursache. Taucht ein weiteres Zeichen auf, dass Du nicht bedacht hast, rennst Du wieder in einen Fehler.

Prepared Statements wären eine Lösung der Ursache, da die Datenbank dann weiß, was Inhalt ist und was SQL ist, d.h. es wird auch jedes Sonderzeichen mit eingetragen ohne Risiken wie SQL Injection.
 
Andreas_ hat doch bereits die Lösung genannt. Ohne Escape kann bereits ein simples ';# als Eingabe zu Inkonsistenzen führen.
 
DualityMind schrieb:
Ich hoffe ich mache keinen Mist.

Doch, du machst großen Mist. Und wenn du so weiterfummelst, wird der Haufen nur noch größer. Du willst Prepared Statements haben - ohne Wenn und Aber.
 
Hallo

Erstmals danke an alle für die schnelle Hilfe.

Ja, das Symptom ist behoben mit preg replace, kommt kein Fehler mehr, dafür nur ein Durcheinandersalat bei der Beschreibung :-( !

Dafür muss ich nicht alles 2x Schreiben und nur noch die Beschreibung dazu umändern.

Ist auch keine gute Lösung. Deshalb probiere ich es doch mal mit "Prepared etc..", wie Andreas beschrieben hat.

Sobald es klappt melde ich mich nochmals :-) ! Danke dass ihr mir helft, ist sehr nett :-)!

LG
Ergänzung ()

Hallo

Also, ich habe jetzt diesen Code mit Prepared Statements.

PHP:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
 
$statement = $pdo->prepare("SELECT * FROM users LIMIT :limit");
$statement->execute(array('limit' => 5));   
while($row = $statement->fetch()) {
   echo $row['vorname']." ".$row['nachname']."<br />";
   echo "E-Mail: ".$row['email']."<br /><br />";
}
?>

Problem ist nun, dass ich meinen ganz Code umschreiben muss damit ich es benutzen kann :-/ .

Ich benutze immer noch die alte Methode mit z.B.

mysql_query( "INSERT INTO pt_programme ( subject,descript,minidescript ) VALUES ( '$subject','$descript','$minidescript' )" );

Die Datenbank Angaben sind bereits initialisiert und eben es funktioniert auch alles so, ausser wenn ich dann die Descript übertrage und es ein Sonderzeichen hat, muss ich den ganzen Eintrag nochmals machen.

Mit PDO erscheint mir das sehr kompliziert, aber anscheinend führt da kein Weg vorbei, dann müsste ich einfach alles umschreiben ?

Wie ich gelesen habe, schreibt es die Daten mit Prepared Statements nicht direkt in die Datenbank und erst dann wenn alles korrekt ausgefüllt ist ?

Ufff, habe langsam Kopfschmerzen :-). Oder gibt es auch die Möglichkeit die alte Schreibweise zu benutzen ?

LG
 
Zuletzt bearbeitet:
Hallo

Ja, nochmals :-)!

Habe dies gelesen:

Solltet ihr mit einer veralteten MySQL-Version arbeiten müssen, oder mit einer anderen Datenbank die keine Prepared Statements unterstützt, so könnt ihr das obige Problem lösen indem ihr den Typ des Parameters als int definiert:

Kann es sein, dass es reicht die Attribute von Descript (Standard: Text) als Descript (INT) einzustellen in der MySQL Datenbank ?

LG
 
Hallo

Habe jetzt die "Descript" Zerschossen, da ich versucht habe es auf INT umzustellen. Jetzt ist bei allen Programmen
eine "0" da und ich kann die alte Beschreibung nicht mehr wiederherstellen.

Was kann ich jetzt tun ? Kann man es wieder herstellen ?

Habe noch ein MySQL Backup, aber sind nicht alle Programme drauf. Besser als alles NEU wieder zuschreiben.

DamI* :-(!

Oder gibt es eine Möglichkeit es wieder herzustellen ?

LG
 
Backup oder ggf. Transaction Log. Und in Zukunft nicht einfach an einer Produktiv-DB rumfrickeln.

Was soll das überhaupt bringen, ein Textfeld auf INT zu ändern? Was hast du denn erwartet?

Du bist aber auch beratungsresistent.
 
Nein, gibt es nicht. Für sowas gibt es Backups.

​Du verstehst dein Problem gar nicht. Du baust MASSIVE Sicherheitslücken in dein Programm ein. Schau dir SQL-Injection an und versteh es, bevor du weitermachst. Und am Besten XSS gleich mit.

​Deine Sicherheitslücken sind so groß, dass man bei normaler Nutzung schon alles kaputt macht.

​Königsweg: PDO mit prepared statements gegen SQL Injection, htmlspecialchars oder XML filtering (mit whitelist) gegen XSS.
 
"Alles neu schreiben" nennt man in dem Zusammenhang wohl eher Refactoring, ist demnach etwas gutes, führt zu mehr Erkenntnis, birgt einen Lerneffekt, gleichzeitig verbessert man also sich und sein Produkt.
Würde das nicht als etwas negatives darstellen.
 
Zurück
Oben