myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   PHP MySQL - Prozentzeichen macht Probleme (https://mygully.com/showthread.php?t=2670481)

jokerface12345 31.07.12 23:40

PHP MySQL - Prozentzeichen macht Probleme
 
Hallo,

ich habe eine Seite in php geschrieben, bei der Werte über Formulare an eine MySQL Datenbank übermittelt werden.

Das Übermitteln der Daten aus den Formular Feldern in die MySQL DB funktioniert auch tadellos.

Nur habe ich folgendes Problem bei einem Vergleich von einem eingegeben Wert in einem Formular Feld und einem Wert der schon in der Datenbank steht:

PHP-Code:

$sql_pruefen "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = $ean AND ausgebucht = 0"

$wert enthält folgendes aus dem Formular Feld:
%000606301799889397094101040

Das Problem ist das %-Zeichen. Es soll möglich sein über die Formular Seite zu prüfen ob dieser Wert schon in der Datenbank vorhanden ist und wenn ja, soll in dem Feld 'anzahl_ausgebucht' eine 1 geschrieben werden. Dies hat den Sinn, wenn ein eingegeben Wert in der Datenbank vorhanden ist, dieser als ausgebucht in der Datenbank markiert werden soll.

So sieht der Code-Abschnitt aus:
PHP-Code:

          <?php
                    
if($_POST["action"]=="ausbuchen"){ 
                    include(
"server_data.php");
    
                    
$mitarbeiter trim($_POST["mitarbeiter"]);
                    
$ean trim($_POST["ean"]);
                    
                    if (empty(
$_POST['mitarbeiter'])){
                            echo 
'Das Feld Mitarbeiter muss ausgefüllt sein!<br/>';  
                    }
                    
                    
$sql_pruefen "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = `$ean` AND ausgebucht = 0";
                    
$result mysql_query($sql_pruefen);
                    
$anzahl mysql_fetch_array($result);
                        echo 
$anzahl['anzahl_ausgebucht'];
    
                    if (
$anzahl['anzahl_ausgebucht'] == 1){
                        
$sql_einfuegen "INSERT INTO ausbuchung(mitarbeiter, ean)    VALUES('$mitarbeiter','$ean')";
                        
mysql_query($sql_einfuegen) or die(mysql_error());
    
                        
$sql_update "UPDATE einbuchung SET ausgebucht = 1, zeitstempel_aus = now() WHERE ean = $ean";
                        
mysql_query($sql_update) or die(mysql_error());
            
                        
$var2 'Ausgebucht!';
                        echo 
"var2=".$var2;
                        }
                    else{
                        
$var2 'Fehler';
                        echo 
"var2=".$var2;
                        }    
      }
?>

Sobald in dem Formular Feld ein Zahl mit dem % Zeichen eingegeben wird und auf den Button "Ausbuchen" geklickt wird springt er zu var2 Fehler.
Die Prozentzeichen sind in dem Feld immer vorhaden, sprich es werden immer Werte mit %123892139123 (Prozent-Zahl) eingegeben.

Wenn ich es ohne % eingebe und auch der gleich Wert ohne % in der DB vorhanden ist funktioniert es!

Was kann ich tun?

Ich habe es auch schon so in der Abfrage versucht:
PHP-Code:

WHERE ean '" . $ean . "' AND ausgebucht 0"; 

Dann erhalte ich folgendes auf der Seite:
Code:

1You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%000606301799889397094101040' at line 1
An der MySQL version liegt es nicht es ist die 5.5.25a.

Habe auch schon eine andere version versucht.

kkhamburg 01.08.12 00:47

Wenn du nach dem Prozentzeichen innerhalb eines Datensatzes suchen willst musst du es escapen.

Das geht unter MySQL so ;
SELECT * FROM `test` WHERE word LIKE 'Wo!%rt' ESCAPE '!'

setze dem Prozentzeichen einen Charakter vorraus und definiere in in der Abfrage als Escape-Character.

jokerface12345 01.08.12 08:28

Ok, ich habe noch nicht ganz verstanden wie ich dem Prozentzeichen einen Charakter vorraus setze.

Wo geschieht dies? Im code habe ich ja eine Variable und kein ausgegebenen String mit % Zeichen (WHERE ean = $ean) . Wo und wie muss ich das ansetzen?

Im übrigen habe ich mit
PHP-Code:

echo $sql_pruefen

folgendes erhalten und direk in MySQL ausgeführt, dies funktioniert ohne Probleme und er setzt das Feld anzahl_ausgebucht auf 1:

Code:

SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = '%000606301799889397094101040' AND ausgebucht = 0
Ledeglich diese Meldung kommt in php wenn der gleiche Befehl ausgeführt wird, was hat diese zu bedeuten?
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%000606301799889397094101040' at line 1

kkhamburg 01.08.12 09:16

Das problem ist, das in SQL das Prozentzeichen als Wildcard interpretiert wird.

Das bedeutet im schlimmsten Fall das er mehr Datensätze ändern würde als du willst.

Mein Beispiel ist eigentlich selbsterklärend, im Suchstring Wo%rt wird dem Prozentzeichen ein Ausrufezeichen vorangestellt und SQL mitgeteilt, dass das Ausrufezeichen ein Escape-Zeichen ist. Damit wird das Prozentzeichen nicht mehr von SQL interpretiert sondern einfach als Teil des Strings gewertet.

Ergo musst du u. U. per String-Replace dafür sorgen das vor dem Prozentzeichen ein Escape-Zeichen ist und dieses SQL bekanntmachen.

ProgMaster 01.08.12 12:34

Wildcards in mySQL bei einem EQUAL-Vergleich?

Wildcards funktionieren nur mit dem LIKE-Operator!


Desweiteren hoffe ich für jokerface, dass dies keine kommerzielle Anwendung werden soll.
Das was du machst ist so sicher und robust wie Windows Vista auf einem China-Netbook.

jokerface12345 02.08.12 10:59

Eshat jetzt funktioniert und zwar hatte in folgedenem Befehl folgendes gefehlt:

PHP-Code:

$sql_update "UPDATE einbuchung SET ausgebucht = 1, zeitstempel_aus = now() WHERE ean =[B] '" $ean "'"[/B

@ProgMaster: Ne das tool ist nur für mein kleines lager gedacht.

Noch eine andere Frage:

Ich habe jetzt noch eine neue Tabelle und Seite mit "umbuchung". Dort soll es möglich sein ein Paket zb. auf einen anderen Stellplatz zu buchen.

Wenn jemand was umbucht wird dies in die Tabelle "umbuchung" geschrieben.

Jetzt soll wenn jemand etwas ausbucht in beiden Tabellen wo etwas gebucht ist "einbuchen" und "umbuchung" geprüft werden ob der eingegeben Wert vorhanden ist, wenn ja soll ausgebucht auf 1 gesetzt werden.

Wie prüfe ich nun beide Tabellen auf vorhandene Werte ? Mit inner join, wenn ja wie?

Zitat:

$sql_pruefen = "SELECT COUNT(*) AS anzahl_ausgebucht FROM einbuchung WHERE ean = '" . $ean . "' AND ausgebucht = 0";
Dort soll noch zusätzlich zu FROM einbuchung noch umbuchung geprüft werden

urga 02.08.12 20:34

nimm dir eine auszeit von 1-3 tagen, besorg dir lektüre und lerne SQL.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.