Zur Navigation

sql Unterabfrage mit Variable

1 webuser

Hallo,
ich will alle Werte aus einer Preistabelle kopieren und in die gleiche Tabelle mit geändertem Jahr anfügen.
Versucht habe ich es mit:
$gjahr = $_POST[gjahr];

        $query=mysqli_query($con,"Insert Into preise (von,bis,preis,gjahr) Select von,bis,preis,'$gjahr' From preise Where gjahr ='$gjahr'") or die ("Error: " . mysqli_error());

14.08.2025 20:47

2 webuser

kleiner Denkfehler: Die Varialbe vom alten Jahr fehlt noch:
$gjahralt = $_POST[gjahralt];
$gjahr = $_POST[gjahr];

        $query=mysqli_query($con,"Insert Into preise (von,bis,preis,gjahr) Select von,bis,preis,'$gjahr' From preise Where gjahr ='$gjahralt'") or die ("Error: " . mysqli_error());

14.08.2025 20:55

3 Jörg Kruse

Fehlermeldung wird nicht ausgegeben?

Aus dem MySQL-Manual:

To avoid ambiguous column reference problems when the SELECT and the INSERT refer to the same table, provide a unique alias for each table used in the SELECT part, and qualify column names in that part with the appropriate alias

also z.B. mit einem Alias p2:

mysqli_query(
    $con,
    "INSERT INTO preise (von, bis, preis, gjahr)
    SELECT p2.von, p2.bis, p2.preis, '" . intval($gjahr) . "'
    FROM preise AS p2
    WHERE gjahr = '" . intval($gjahralt) . "'"
) or die ("Error: " . mysqli_error());

Auch wenn nur du selbst das Script ausführst, würde ich übrigens grundsätzlich und immer Variablen in einer Query gegen SQL-Injection absichern, im Fall von Jahreszahlen z.B. mit intval().

14.08.2025 21:36

1 Forenmitglied fand diesen Beitrag gut

4 webuser

Hallo Jörg,
vielen Dank, auch für deinen Hinweis.
Gruß

14.08.2025 21:52

5 Jörg Kruse

Nachtrag:

die Spalte im WHERE Statement sollte wohl auch den Alias vorangestellt bekommen:

mysqli_query(
    $con,
    "INSERT INTO preise (von, bis, preis, gjahr)
    SELECT p2.von, p2.bis, p2.preis, '" . intval($gjahr) . "'
    FROM preise AS p2
    WHERE p2.gjahr = '" . intval($gjahralt) . "'"
) or die ("Error: " . mysqli_error());

14.08.2025 22:14

1 Forenmitglied fand diesen Beitrag gut

6 webuser

Hallo,
die Abfrage hat noch einen Haken: bei dem beiden Datumsfeldern: von, bis muss auch noch das neue Jahr angepasst werden.
Versucht habe ich es mit:
 
$oldyear = intval($oldyear) ;
$newyear = intval($newyear) ;
$query=mysqli_query($con,                                              "INSERT INTO preise (von, bis, gruppe, bemerkung, preis, gjahr)
                                              SELECT (STR_TO_DATE(p2.von","$newyear-%m-%d)), (STR_TO_DATE(p2.bis","$newyear-%m-%d)), p2.gruppe, p2.bemerkung, p2.preis, '" . $newyear . "'
                                              FROM preise AS p2
                                              WHERE p2.gjahr = '" . $oldyear . "'"
                                          ) or die ("Error: " . mysqli_error());

17.08.2025 12:57

7 Jörg Kruse

Liegen von und bis im Format DATE vor?

ggf. kannst du mit DATE_ADD ein oder mehrere Jahre hinzuaddieren, z.B.:

DATE_ADD(p2.von, INTERVAL 1 YEAR)

17.08.2025 22:03

8 webuser

Hallo,
das ist jetzt mein Ansatz:
               $query=mysqli_query($con,
                                              "INSERT INTO preise (von, bis, gruppe, bemerkung, preis, gjahr)
                                              SELECT CONCAT( '" . $newyear . "' ,  '-', SUBSTRING( p2.von, 7, 2 ) ,  '-', SUBSTRING( p2.von, 3, 2 ) ), CONCAT(  '" . $newyear . "' ,  '-', SUBSTRING( p2.bis, 7, 2 ) ,  '-', SUBSTRING( p2.bis, 3, 2 ) ), p2.gruppe, p2.bemerkung, p2.preis, '" . intval($newyear) . "'
                                              FROM preise AS p2
                                              WHERE p2.gjahr = '" . intval($oldyear) . "'"
                                          ) or die ("Error: " . mysqli_error());

17.08.2025 22:06

9 webuser

Hallo Jörg,
deine Lösung war die einfachste.

Etwas komplizierter:
               $query=mysqli_query($con,
                                              "INSERT INTO preise (von, bis, gruppe, bemerkung, preis, gjahr)
                                              SELECT CONCAT( '" . $newyear . "' ,  '-', DATE_FORMAT(p2.von, '%m-%d')), CONCAT( '" . $newyear . "' ,  '-', DATE_FORMAT(p2.bis, '%m-%d')), p2.gruppe, p2.bemerkung, p2.preis, '" . intval($newyear) . "'
                                              FROM preise AS p2
                                              WHERE p2.gjahr = '" . intval($oldyear) . "'"
                                          ) or die ("Error: " . mysqli_error());

17.08.2025 22:27

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]