Nach Umstellung der PHP Version

CreativPur

Erfahrenes Mitglied
Hi,
mein Provider hat eine PHP Version Umstellung von 7.5 auf 8.1 vorgenommen.

Seitdem habe ich zwar meine Seite wieder zum laufen gebracht, dennoch mach mir folgendes Script seit Tagen Kopfzerbrechen.
Es geht um ein Lotto-System wo ich ich Lottozahlen aktivieren, bzw. deaktivieren kann.

Diese Funktion funktioniert auch soweit.
Nur lassen sich die Zahlen nicht mehr speichern..

Das bisherige Script schaut folgend aus..

PHP:
$nr = count($_POST['wochentag']);
$aktiv = [];
for ($i = 0; $i < $nr; $i++) {
    $aktiv[$i] = 0;
        }
for ($j = 0; $j < count($_POST['aktiv']); $j++) {
    $i = $_POST['aktiv'][$j];
    $aktiv[$i] = 1;
        }
if (isset($_GET['lz_aendern'])) {
    $error = false;
for ($i = 0; $i < $nr; $i++) {
    $id_lz = $_POST['id_lz'][$i];
    $wochentag = $_POST['wochentag'][$i];
    $lottozahl = $_POST['lottozahl'][$i];
    $aktiv = $aktiv[$i];

$statement = $pdo->prepare("UPDATE lotto_zahlen SET aktiv = :aktiv_neu, wochentag = :wochentag_neu, lottozahl = :lottozahl_neu WHERE id_lz = :id_lz");
$statement->execute(array('id_lz' => $id_lz, 'aktiv_neu' => $aktiv, 'wochentag_neu' => $wochentag, 'lottozahl_neu' => $lottozahl));
    }
}

Der Code für Auswahl der Zahlen ist folgend..

PHP:
<?php
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen WHERE wochentag = '$wochentag'   AND aktiv = 1 Order BY lottozahl ASC";
echo 'Aktive Lottozahlen:&nbsp;&nbsp;'      ;
foreach ($pdo->query($sql) as $lz) {
echo  '<span style="color:green;font-size:16px;">'   .$lz['lottozahl']. '    </span>&nbsp;';                       
}
?>       
                          
<form action="lotto.php?lz_aendern&wochentag=<?php echo $_GET['wochentag'] ?>&limit=<?php echo $_GET['limit'] ?> "  method="post">                             
<br />   
<table border="1" align="center">
<tr align="center">     
<?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag' AND lottozahl  IN (1,2,3,4,5,6,7)   Order BY lottozahl ASC";
$i = 0;
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?> id="lz_<?php echo $lz_td['id_lz'] ?>"/> <label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
 <?php
           $i++;                               
} ?>
</td>   
 </tr> 
    
<tr align="center"> 
  <?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag'    AND lottozahl IN (8,9,10,11,12,13,14)   Order BY lottozahl ASC ";
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php  if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?> id="lz_<?php echo $lz_td['id_lz'] ?>"/><label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
    
<?php     
     $i++;     
}                             
?>
</td>   
</tr>
    
  <tr align="center"> 
  <?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag' AND lottozahl IN (15,16,17,18,19,20,21)   Order BY lottozahl ASC ";
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php  if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?> id="lz_<?php echo $lz_td['id_lz'] ?>"/><label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
<?php     
     $i++;     
}                             
?>
</td>   
</tr>   
    
 <tr align="center"> 
  <?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag' AND lottozahl IN (22,23,24,25,26,27,28)   Order BY lottozahl ASC ";
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php  if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?> id="lz_<?php echo $lz_td['id_lz'] ?>"/><label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
<?php     
     $i++;     
}                             
?>
</td>   
</tr>     
    
 <tr align="center"> 
  <?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag' AND lottozahl IN (29,30,31,32,33,34,35)   Order BY lottozahl ASC ";
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php  if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?> id="lz_<?php echo $lz_td['id_lz'] ?>"/><label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
<?php     
     $i++;     
}                             
?>
</td>   
</tr>       
    
 <tr align="center"> 
  <?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag' AND lottozahl IN (36,37,38,39,40,41,42)   Order BY lottozahl ASC ";
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php  if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?>  id="lz_<?php echo $lz_td['id_lz'] ?>"/><label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
<?php     
     $i++;     
}                             
?>
</td>   
</tr>       
    
 <tr align="center"> 
  <?php                               
$wochentag = $_GET['wochentag'];
$sql = "SELECT * FROM lotto_zahlen  WHERE wochentag = '$wochentag' AND lottozahl IN (43,44,45,46,47,48,49)    Order BY lottozahl ASC ";
foreach ($pdo->query($sql) as $lz_td) {     
?>   
<td>
<input type="checkbox" name="aktiv[]" value="<?php echo $i; ?>" <?php  if ( $lz_td['aktiv']) {  echo "checked"; } else { echo ""; } ?> id="lz_<?php echo $lz_td['id_lz'] ?>"/><label for="lz_<?php echo $lz_td['id_lz'] ?>"><?php echo $lz_td['lottozahl'] ?></label>
<input type="hidden" class="form-control" name="id_lz[]" value="<?php echo $lz_td['id_lz'] ?>">
<input type="hidden" class="form-control" name="wochentag[]" value="<?php echo $lz_td['wochentag'] ?>">
<input type="hidden" class="form-control" name="lottozahl[]" value="<?php echo $lz_td['lottozahl'] ?>">
<input type="hidden" class="form-control" name="historie_lz[]" value="<?php echo $lz_td['historie_lz'] ?>">
<?php     
     $i++;     
}                             
?>
</td>   
</tr>   
    
</table> 
<br />
<div align="center">
<button type="submit" class="btn btn-info btn-sm">speichern</button>
</div>
</form>

Bildschirmfoto 2022-11-21 um 07.30.57.png


Das erste Script blockiert meine Seite, so dass sie nur weiß erscheint..

Worin liegt der Fehler ?
 
Bin mir nicht mal sicher, dass es das erste Skript ist.
Was mir auffällt im zweiten Skript:
PHP:
$sql = "SELECT * FROM lotto_zahlen WHERE wochentag = '$wochentag'   AND aktiv = 1 Order BY lottozahl ASC";
Ich war der Meinung Zeichenverkettung wäre der Punkt. Hätte sowas erwartet:
PHP:
$sql = "SELECT * FROM lotto_zahlen WHERE wochentag = '" . $wochentag . "'   AND aktiv = 1 Order BY lottozahl ASC";
btw: Wieso benutzt du in dieser SQL Zeichenverkettung? Im ersten Skript haste sauber mit Parametern gearbeitet.

Ansonsten: Fehlerbehandlung hoch schrauben?

EDIT: Hast du mal geprüft, nachdem das erste Skript abgearbeitet ist, ob das "UPDATE" gegriffen hat?
Weil wenn ja, dann ist es nicht das erste Skript...
 
Zuletzt bearbeitet:
Hm...
Ich habe es mit Punkten noch nie geschrieben.
Zumindest hat es bisher immer funktioniert.
Ich werde es in Zukunft mit Punkten versuchen, und schauen was passiert..

Dennoch glaube ich, dass es am ersten Script liegt.
Sowie ich die Funktion raus nehme, habe ich wieder meine komplette Seite mit allen Funktionen.
Nur halt das Upload eben nicht.

An der "Zeichenverkettung" habe ich lang mit ein paar Leuten hier im Chat rumgebastelt, bis es endlich funktionierte.

Was meinst Du mit "Fehlerbehandlung hoch schrauben?"
 
Bin mir nicht mal sicher, dass es das erste Skript ist.
Was mir auffällt im zweiten Skript:
PHP:
$sql = "SELECT * FROM lotto_zahlen WHERE wochentag = '$wochentag'   AND aktiv = 1 Order BY lottozahl ASC";
Ich war der Meinung Zeichenverkettung wäre der Punkt. Hätte sowas erwartet:
Man kann $variable innerhalb eines doppelten Anführungszeichens benutzen. Nicht bei einfachen Anführungszeichen.
Ich persönlich arbeite gerne mit der curly-Variante. Ist am saubersten. Grad wenn man noch mit Arrays etc. arbeitet
PHP:
$sql = "SELECT * FROM lotto_zahlen WHERE wochentag = '{$wochentag}'   AND aktiv = 1 Order BY lottozahl ASC";
 
Per Echo werden die Daten auch mit '$wochentag' ausgegeben.
Aber ich lass mich gern von Spezialisten beraten.

Dennoch ist das Problem wie zuvor noch vorhanden.
Es ist in der Tat so, wenn ich das UPDATE raus lasse, ist die Seite wieder da.
Aber wie mache ich das nun mit dem UPDATE? Ich muss es doch irgendwie abspeichern können ?
 
Kann nur bedeuten, dass der Bock mit dem pdo-objekt zusammenhängt.
Nur um sicher zu gehen: Hast du nachdem die UPDATE-Zeile ausgeführt wurde in der Datenbank nachgeschaut (mit phpMyAdmin oder MySQL-Workbench) ob es tatsächlich fehlt?
Mir gehts nicht darum ob deine Seite dann wieder da ist
 
Gemäss dem hier: PHP: PDO::prepare - Manual
Achte auf die eckigen Klammern in der zweiten Zeile.
Und mach mal nen vardump für $statement
Weil wenn das prepare fehlschlägt, sollte False rauskommen
PHP:
$statement = $pdo->prepare("UPDATE lotto_zahlen SET aktiv = :aktiv_neu, wochentag = :wochentag_neu, lottozahl = :lottozahl_neu WHERE id_lz = :id_lz");
$statement->execute(['id_lz' => $id_lz, 'aktiv_neu' => $aktiv, 'wochentag_neu' => $wochentag, 'lottozahl_neu' => $lottozahl]);

EDIT: Ok, kann nicht daran liegen. Array(...) ist gültige Syntax.
PHP: PDOStatement::execute - Manual
Weise das Execute-Ergebnis mal einer Variablen zu.
PHP:
$bla=$statement->execute(array('id_lz' => $id_lz, 'aktiv_neu' => $aktiv, 'wochentag_neu' => $wochentag, 'lottozahl_neu' => $lottozahl));
//vardump $bla
 
Zurück