Bei Prepared Statement Zeichen ersetzen

Werbung:
Und es geht doch.

Hallo nochmal,

also in der Datenbank werden zwar die Werte nach wie vor als Decimal(11,2) gespeichert, aber das Prepared Statement habe ich wie folgt geändert.

Code:
if($_POST['uebernehmen'])
{
    $stmt=$mysqli->prepare($insertziele);
    $stmt->bind_param("sssssssssssssss",
    $uid,
    $_POST['ziel1'],
    $_POST['ziel2'],
    $_POST['ziel3'],
    $_POST['ziel4'],
    $_POST['ziel5'],
    $_POST['ziel6'],
    $_POST['ziel7'],
    $_POST['ziel1'],
    $_POST['ziel2'],
    $_POST['ziel3'],
    $_POST['ziel4'],
    $_POST['ziel5'],
    $_POST['ziel6'],
    $_POST['ziel7']);
    $stmt->execute();
}

Code:
$insertziele="INSERT INTO zielema (jahr, id_betreuer, ziel1, ziel2, ziel3, ziel4, ziel5, ziel6, ziel7) VALUES
(2013,
?,
REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
REPLACE(REPLACE(?, '.' , ''), ',' , '.'))
ON DUPLICATE KEY UPDATE
ziel1= REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
ziel2= REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
ziel3= REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
ziel4= REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
ziel5= REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
ziel6= REPLACE(REPLACE(?, '.' , ''), ',' , '.'),
ziel7= REPLACE(REPLACE(?, '.' , ''), ',' , '.');"
;


Siehe da, es geht. Durch den REPLACE Befehl werden die Punkte gelöscht und die Kommas durch Punkte ersetzt. Hattest doch recht, dass es sich um Strings handelt und nicht um Dezimalzahlen. Was da aber dann die Definition in der Datenbank bringen soll, weiß ich auch nicht.

Gruß und Dank!
 
Und es geht doch.

Hallo nochmal,


Siehe da, es geht. Durch den REPLACE Befehl werden die Punkte gelöscht und die Kommas durch Punkte ersetzt. Hattest doch recht, dass es sich um Strings handelt und nicht um Dezimalzahlen. Was da aber dann die Definition in der Datenbank bringen soll, weiß ich auch nicht.

Gruß und Dank!

Ja, nun übergibst das Ergebnis der Replace-Funktion.

Was meinst mit Definition in der DB? Das es decimal ist?
 
Wie meinst du das Ergebnis der Replace Funktion übergeben. Replace ist ja schon in dem Prepared Statement mit drin. Ich meinte die Spaltendefinition (Spaltentyp) der Datenbankspalte. In phpmyadmin kann ich dort decimal(11,2) angeben.
 
Ich meinte, warum im Prepared Statement der zu erwartende Wert als String benannt ist, während doch in der DB dieser als decimal hinterlegt ist.
 
Bzw. warum der Wert im Prepared Statement als String benannt werden muss, wenn doch in der DB dieser als decimal gespeichert wird.

Versetz Dich in die Sichweise aus der DB. Wenn das was ankommt wie '123,45', dann sind das 2 Werte, durch Komma getrennt. Wenn da was ankommt wie '123.45', dann ist das ein Wert, und zwar 123 und noch mal knapp die Hälfte eines Ganzen Euro zusammen, also das, was Du im täglichen Leben als 123,45 Euro wahrnimmst.

Oder anders: 123 Euro und 45 Euro oder 123 Euro und 45 Cent. Was ist Dir lieber?

So, und nun könntest mir auch mal ein 'Gefällt mir' opfern, oder?


Andreas
 
Hallo,

ich glaube zu verstehen. Wenn eine Zahl durch ein Komma getrennt ist, handelt es sich um eine Stringvariable. Wenn eine Zahl durch einen Punkt getrennt ist, dann erkennt die DB das als Zahl. Du meinst ich soll unten auf "Empfehlen" klicken?
 
Hallo,

ich glaube zu verstehen. Wenn eine Zahl durch ein Komma getrennt ist, handelt es sich um eine Stringvariable. Wenn eine Zahl durch einen Punkt getrennt ist, dann erkennt die DB das als Zahl.
Ja, so im Prinzip. In PostgreSQL gehen solche Spielereien:

Code:
test=*# select pg_typeof(123,45);
ERROR:  function pg_typeof(integer, integer) does not exist
LINE 1: select pg_typeof(123,45);
  ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
test=*#
test=*#
test=*#
test=*#
test=*# select pg_typeof(123.45);
 pg_typeof
-----------
 numeric
(1 row)

test=*# select pg_typeof(123,45);
ERROR:  function pg_typeof(integer, integer) does not exist
LINE 1: select pg_typeof(123,45);
  ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
test=*# select pg_typeof('123.45'::numeric);
 pg_typeof
-----------
 numeric
(1 row)

test=*# select pg_typeof('123.45'::text);
 pg_typeof
-----------
 text
(1 row)


Du meinst ich soll unten auf "Empfehlen" klicken?

Ähm, nö. Aber schau mal, was neben 'Zitieren' steht ;-)
 
Werbung:
Zurück
Oben