PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten (http://www.selfphp.de/forum/showthread.php?t=26029)

swissape 09.07.2017 20:36:22

Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Ich habe einen 10 jahre alten Code erneuen müssen und kommt jetzt einem Problem näher
Im Moment habe ich einn Unterschied zwischen mysql_* und mysqli_* Abfragen im Verdacht
Die wirkliche Anpassung ist dass ich die Aufrufe angepasst habe - also mysql_* nach mysqli_* und auch mysql_num_rows() nach Var->num_rows

PHP-Code:

$gest=$_POST['gest'];

# von 1 bis

$query="SELECT id FROM tm_nm_tips WHERE woche='$woche_id' AND saison='$saison_id'";
$ids=mysqli_query($db_connection,$query);
//$anz_ids=mysqli_numrows($ids);
$anz_ids $ids->num_rows;
for (
$id=0;$id<$anz_ids;$id++) {
    
$wert=mysqli_fetch_array($ids);
    if (
$gest[$wert['id']]==1) {
        
$new_spielt_status=1;
    } else {
        
$new_spielt_status=0;
    }
    
$query2="UPDATE tm_nm_tips SET spielt='$new_spielt_status' WHERE id='$wert[id]'";
    
mysqli_query($db_connection,$query2) or die($query2);


Verrückterweise liefert mir das Ergebnis jetzt nur 50 % der Einträge in die DB und NULLT die anderen.

In diesem script werden bis dahin eingetragene Datensätze komplettiert ... und am Ende gespeichert
Das hat unter mysql_* gut funktioniert
Die Datenbankabfrage liefert ein ARRAY mit 652 IDs zurück.
nach dem Abseneden bekomme ich jedoch für alle 652 IDs Undefined offset: und ein Undefined index: - alles in Line 27 - das ist
PHP-Code:

 if ($gest[$wert['id']]==1) { 

Verhält sich mysqli da strikter als mysql ?
Oder wurden ähnliche meldungen in mysql nur unterdrückt (oder ich hab irgendwo das errorhandling aktiviert? )

Wo kann ich hier nach dem Fehler suchen ?
merci für jedwede Hilfe
swissape

vt1816 09.07.2017 21:48:45

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Poste bitte mal den "alten" Code um einen Vergleich zu haben und für besseres Verständnis.

swissape 10.07.2017 11:18:09

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Hallo,

PHP-Code:

$gest=$_POST['gest'];

# von 1 bis

$query="SELECT id FROM tm_nm_tips WHERE woche='$woche_id' AND saison='$saison_id'";
$ids=mysql_query($query,$db_connection);
$anz_ids=mysql_numrows($ids);
for (
$id=0;$id<$anz_ids;$id++) {
    
$wert=mysql_fetch_array($ids);
    if (
$gest[$wert['id']]==1) {
        
$new_spielt_status=1;
    } else {
        
$new_spielt_status=0;
    }
    
$query2="UPDATE tm_nm_tips SET spielt='$new_spielt_status' WHERE id='$wert[id]'";
    
mysql_query($query2) or die($query2);
}

$statusmeldung="übernommen";
?> 


Also wirklich nur die notwendigen Aenderungen (Parameter, mysql-> mysqli, Funktionsnamen)

Greetz
swissape

vt1816 10.07.2017 12:13:12

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Was mir auf den ersten Blick auffällt, dass Du objektorientierten und prozeduralen Stil beim mysqli_* mischt. Benutze durchgehend nur einen von beiden Stilen.

Poste bitte mal die komplette Fehlermeldung(en).

swissape 11.07.2017 09:53:02

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Wie schon James sagt : "Couriosity killed the cat"

Keine Fehlermeldung, nur unterschiedliche Ergebnisse.

mysql_* liefert komplettes Ergebnis, d.h. Ergebnisse für Heimteam und Auswärtsteam

mysqli_* liefert NUR Ergebnisse für das Auswärtsteam

Wir haben einen counter eingebaut. Wenn ich die Spiele lade sagt er 340+ Datensätze geladen, wenn ich sie dann mit dem abgebildeten Script jetzt verarbeite, d.h ändere - sind hinterher nur 174 verarbeitet und die Heimergebnisse sind leer.
Erneutes Anzeigen zeigt dass er die Spiele für das heimteam einfach löscht

Greetz
swissape

vt1816 11.07.2017 10:26:31

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Zitat:

Zitat von swissape (Beitrag 149238)
[..]
nach dem Abseneden bekomme ich jedoch für alle 652 IDs Undefined offset: und ein Undefined index: ...

versus

Zitat:

Zitat von swissape (Beitrag 149248)
[..]
Keine Fehlermeldung, nur unterschiedliche Ergebnisse.

Was denn nun? Fehler oder kein Fehler?


Zitat:

Zitat von swissape (Beitrag 149248)
[..]
Erneutes Anzeigen zeigt dass er die Spiele für das heimteam einfach löscht

Aber nicht durch den oben geposteten Code.

swissape 11.07.2017 10:36:16

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Ja sorry, aber das sind WARNINGS

Ich hab die jetzt nicht hier ... da ich nur von daheim auf alles zugreifen kann
War so in etwa:

WARNING Undifined offset 695347 in file .....tips_markieren_liga_do.php in row 27

für alle zeilen die ein SQL aus der DB zurückliefert (652 -695347 bis 69999 )

und einmal am Ende :

WARNING Undifined Index : in file ...tips_markieren_liga_do.php in row 27

*ausinternemMemoryzitiert*
Greetz
swissape

swissape 11.07.2017 10:40:46

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Zitat:

Zitat von vt1816 (Beitrag 149249)
versus


Aber nicht durch den oben geposteten Code.


ist aber der der durch drüken des Buttons ausgeführt wird, zumindest wie ich es sehe

Das Teil wird m.E. aus diesem Script heraus aufgerufen wenn ich den Button "akt." drücke

PHP-Code:

<?php

function isChecked$spielt )
{
    if ( 
$spielt == ) {
        return 
' checked="checked"';
    } else {
        return 
'';
    }
}

function 
tippsCountColor$cnt$l )
{
    if ( 
$cnt == && $l == 'h' ) {
        return 
'#00ff00';
    } else if ( 
$cnt == && $l == 'a' ) {
        return 
'#00ff00';
    } else {
        return 
'#ff0000';
    }
}

function 
output_hauptfeld()
{
    require (
"variablen.php");

    
########
    ## einlesen der edit_variablen:
    ## $saison_id ->
    ## $woche_id ->
    ## $live_status ->
    ########

    
$query "SELECT *
              FROM tm_nm_saisons
              WHERE aktuell_edit='1'"
;
    
$saison_to_edit mysqli_query($db_connection$query);
    
$data mysqli_fetch_array$saison_to_edit );
    
$saison_id $data['saison_id'];
    
$woche_id $data['aktuelle_woche_edit'];
    
$live_status $data['live_status'];

    
########
    ## abfrage der ansetzungsdatenbank nach den
    ## 50 spielen des wochenendes
    ########

?>
<script type="text/javascript">
     function updateVisibility( id, st )
     {
         var tbl = document.getElementById( id );
         var currDisplay = tbl.style.display;
         if ( currDisplay == st ) {
             tbl.style.display = 'none';
         } else if ( currDisplay == 'none' ) {
             tbl.style.display = st;
         } else {
             tbl.style.display = 'none';
         }
         return true;
     }

     function toggleVisibility( id )
     {
         updateVisibility( id + '-h', 'table' );
         updateVisibility( id + '-hhr', 'block' );
         updateVisibility( id + '-a', 'table' );
         updateVisibility( id + '-ahr', 'block' );
         return true;
     }
</script>
<form method="post" action="admin.php">
    <input type="hidden" name="what" value="26">
    <?php

    $spieltage 
= array( $woche_id 1$woche_id );
    foreach ( 
$spieltage as $spieltag ) {
        
$query "SELECT hometeam_id as teama, awayteam_id as teamb,
                         t1.old_names as teama_name, t2.old_names as teamb_name
                  FROM tm_nm_ansetzungen
                  LEFT JOIN tm_nm_teams t1
                    ON (hometeam_id = t1.team_id)
                  LEFT JOIN tm_nm_teams t2
                    ON (awayteam_id = t2.team_id)
                  WHERE saison = '$saison_id'
                    AND spieltag = '$spieltag'"
;
        
$ansetzungen mysqli_query$db_connection$query );
        
//$anz_ansetzungen = mysqli_numrows( $ansetzungen );
        
$anz_ansetzungen $ansetzungen->num_rows;
        for ( 
$spiel 0$spiel $anz_ansetzungen; ++$spiel) {
            
$checked_count1 0;
            
$checked_count2 0;
            
$partie mysqli_fetch_array$ansetzungen );
            
$teama $partie['teama'];
            
$teamb $partie['teamb'];

            
$query2 "SELECT id, saison, woche, t.player_id,
                              p.player_name as name, team_id, vsteam_id,
                              spiel_get, tip, pos, spielt
                       FROM tm_nm_tips t
                       LEFT JOIN tm_nm_players p
                         USING (player_id)
                       WHERE t.team_id='$teama'
                         AND t.vsteam_id='$teamb'
                         AND t.woche='$woche_id'
                         AND t.saison='$saison_id'"
;
            
$tips mysqli_query$db_connection,$query2 );
            
//$anz_tips = mysqli_numrows( $tips );
            
$anz_tips $tips->num_rows;

            
$heimtipps = array();
            
$checked_heimtipps 0;
            for ( 
$i 0$i $anz_tips; ++$i ) {
                
$tmpTip mysqli_fetch_array$tips );
                if ( 
$tmpTip['spielt'] == ) {
                    
$checked_heimtipps++;
                }
                
$heimtipps[] = $tmpTip;
            }

            
$query3 "SELECT id, saison, woche, t.player_id,
                              p.player_name as name, team_id, vsteam_id,
                              spiel_get, tip, pos, spielt
                       FROM tm_nm_tips t
                       LEFT JOIN tm_nm_players p
                         USING (player_id)
                       WHERE t.team_id='$teamb'
                         AND t.vsteam_id='$teama'
                         AND t.woche='$woche_id'
                         AND t.saison='$saison_id'"
;
            
$tips3 mysqli_query$db_connection$query3 );
            
//$anz_tips3 = mysqli_numrows( $tips3 );
            
$anz_tips3 $tips3->num_rows;

            
$auswtipps = array();
            
$checked_auswtipps 0;
            for ( 
$i 0$i $anz_tips3; ++$i ) {
                
$tmpTip mysqli_fetch_array$tips3 );
                if ( 
$tmpTip['spielt'] == ) {
                    
$checked_auswtipps++;
                }
                
$auswtipps[] = $tmpTip;
            }

    
?>
    <div style="font-family: Verdana; font-size: 1.2em; color: blue; font-weight: bold">
        #<?=$spieltag?>, <?=($spiel+1)?> |
        <?=$partie['teama_name']?> - <?=$partie['teamb_name']?>
        <span style="background-color: #8f8f8f;" colspan="2" align="center">
            [
            <span style="background-color: <?=tippsCountColor($checked_heimtipps, 'h')?>;">&nbsp;<?=$checked_heimtipps?>&nbsp;</span>
            -
            <span style="background-color: <?=tippsCountColor($checked_auswtipps, 'a')?>;">&nbsp;<?=$checked_auswtipps?>&nbsp;</span>
            ]
        </span>
        &nbsp;&nbsp;&nbsp;
        <span onclick="toggleVisibility('<?=$spieltag?>-<?=($spiel+1)?>');">&gt;&gt;</span>
    </div>
    <br />
    <table id="<?=$spieltag?>-<?=($spiel+1)?>-h" style="display: <?=$checked_heimtipps==5?'none':'table'?>">
    <?php

            
foreach ( $heimtipps as $tip ) {

        
?>
        <tr>
            <td style="font-family: Verdana; font-size: 1em; color: black;"><?=$tip['name']?></td>
            <td style="font-family: Verdana; font-size: 1em; color: black;"><?=$tip['spiel_get']?></td>
            <td style="background-color: #ff0000; font-family: Verdana; font-size: 1em; color: black; font-weight: bold"><?=$tip['pos']?></td>
            <td><input type="checkbox" name="gest[<?=$tip[id]?>]"<?=isChecked($tip['spielt'])?> value="1"></td>
        </tr>
        <?php

            
}

    
?>
    </table>
    <hr id="<?=$spieltag?>-<?=($spiel+1)?>-hhr" style="display: <?=$checked_heimtipps==5?'none':'block'?>" />
    <table id="<?=$spieltag?>-<?=($spiel+1)?>-a" style="display: <?=$checked_auswtipps==4?'none':'table'?>">
    <?php

          
foreach ( $auswtipps as $tip ) {

        
?>
        <tr>
            <td style="font-family: Verdana; font-size: 1em; color: black;"><?=$tip['name']?></td>
            <td style="font-family: Verdana; font-size: 1em; color: black;"><?=$tip['spiel_get']?></td>
            <td style="background-color: #ff0000; font-family: Verdana; font-size: 1em; color: black; font-weight: bold;"><?=$tip['pos']?></td>
            <td><input type="checkbox" name="gest[<?=$tip['id']?>]"<?=isChecked($tip['spielt'])?> value="1"></td>
        </tr>
        <?php

            
}

    
?>
    </table>
    <hr id="<?=$spieltag?>-<?=($spiel+1)?>-ahr" style="display: <?=$checked_auswtipps==4?'none':'block'?>" />
    <?php

        
}
    }

    
?>
    <input type="submit" name="Go" value="Akt.">
</form>
<?php

}

?>

Es kann natürlich sein dass dieser die Daten dann einträgt und der Fehler hier passiert ....
das mixing procedural - OO ist wieder mein Fehler, hab mir rausgesucht wie ich es in mysqli machen soll aber die beiden Styles nicht beachtet. Das setze ich ntürlich als ersten um auf procedural

Und wie beschrieben, wenn ich das script zum ersten mal laufen lasse bekomme ich 347 (ist normal, dass nicht alle 652 Zeilen kommen) aus eine Datei eingelesen und angezeigt
Erst wenn ich den Button "Akt." am Ende drücke fallen die Tipps für "h" weg - die für "a" bleiben drin. Wenn ich dann noch einmal aufrufe sehe ich dass alle H-Tipps weg sind, also leere Zeilen und in der DB mit Werten für Dummy-Tipp

Greetz
swissape

vt1816 11.07.2017 16:04:30

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Gut. Der jetzt gepostete Code erzeugt lediglich die Ausgabe auf dem Bildschirm. In ihm wird nichts "gelöscht", da er nur SELECT's enthält. Was steht in der Datei admin.php? Diese Datei wird aufgerufen wenn Du auf "Akt." drückst.

swissape 11.07.2017 20:14:54

AW: Abfrage unter mysql_* und mysqli_* liefert unterschiedliches Verhalten
 
Hallo vt1816

in der admin.php ist ein Rahmen von dem die Unterprogramme aufgerufen werden und die Button aktiviert und deaktiviert werden.

Erst wird die tips_markieren_liga_form.php aufgerufen und von hier dann über den Button "Akt."
Ueber diesen Button wird mM nach durch diesen Code-teil :

Code:

<form method="post" action="admin.php">
    <input type="hidden" name="what" value="26">
    <?php

dann tips_markieren_liga_do.php

ausgeführt, welcher den Update später macht und irgendwie die Heimtipps verliert.

Greetz
swissape


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:30:01 Uhr.

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