ilch Forum » Allgemein » HTML, PHP, SQL,... » json-Array liefert Null

Geschlossen
  1. #1
    User Pic
    Outi77 Mitglied
    Registriert seit
    31.03.2013
    Beiträge
    1.337
    Beitragswertungen
    143 Beitragspunkte
    Hallo zusammen,
    folgende Sachlage:
    Per Auswahl in einem
    <select id="spieltage" name="spieltage">
    möchte ich verschiedene Inhalte per ajax nachladen.
    <script type="text/javascript">
        $(document).ready(function() {
            // Spieltage
            $('#spieltage').on('change', function(e) {
                e.preventDefault();
                var stid = $('#spieltage').val();
    
                $.ajax({
                    url         : 'index.php?tippspiel-getspieltag',
                    type        : 'POST',
                    dataType    : 'json',
                    data        : {
                        spieltagid: stid
                    },
                    success     : function(response) {
                        if (response.success) {
                            $('.spieltag').html(response.spieltag);
                        } else {
                            alert(response.errorMsg);
                        }
                    }
                });
            });
        });
    </script>

    Für die Ausgabe habe ich mir eine Funktion geschrieben:
    function renderSpieltage($stid, tpl $tpl) {
        $erg = db_query("SELECT s.spieltag, s.datum, s.heim_id, s.gast_id, th.id as hometeam_id, th.team_name as hometeam_name, tg.id as gastteam_id, tg.team_name as gastteam_name
                        FROM prefix_tippspiel_spiele as s
                        LEFT JOIN prefix_tippspiel_teams as th ON s.heim_id = th.id
                        LEFT JOIN prefix_tippspiel_teams as tg ON s.gast_id = tg.id
                        WHERE spieltag = " . $stid);
        $ergAnz = db_num_rows($erg);
        if ($ergAnz == 0) {
            echo '<b>Spieltag nicht angelegt</b>';
        } else {
            $anz = $ergAnz;
            $nr = 0;
            while ($row = db_fetch_assoc($erg)) {
                $nr++;
                $class = ($class == 'Cmite' ? 'Cnorm' : 'Cmite');
                $heim = $row['hometeam_name'];
                $gast = $row['gastteam_name'];
                $vs = '-';
                
                $ar1 = array (
                    'class' => $class,
                    'nr'    => $nr,
                    'heim'  => $heim,
                    'vs'    => $vs,
                    'gast'  => $gast
                );
                $tpl->set_ar_out($ar1, 1);
            }
        }
    }

    Beim Ändern der Auswahl im
    <select>
    wird nun in der tippspiel.php im
    case 'getspieltag'
    in den Ausgabe-Puffer geschrieben und verschiedene Variablen gefüllt.
    case 'getspieltag':
            $success = false;
            $stid = escape($_POST['spieltagid'], 'integer');
            if ($stid > 0) {
                $success = true;
                ob_start();
                $tpl = new tpl('tippspiel/admin/rounds');
                renderSpieltage($stid, $tpl);
                $spieltag = ob_get_clean();
            } else {
                $errorMsg = 'Bitte Spieltag wählen';
            }
    
            $response = array(
                'spieltag' => $spieltag,
                'success' => $success,
                'errorMsg' => $errorMsg
            );
            echo json_encode($response);
            break;

    Das Ergebnis ist leider nicht zufriedenstellend:
    gesperrtes Bild
    Die Variable
    $spieltag
    ist null.

    Wenn ich statt
    echo json_encode($response);
    aber einfach das response-Array mit print_r ausgebe, sieht es besser aus:
    gesperrtes Bild
    Hat jemand eine Idee, warum im response-Array die Variable null ist?
    Meine Vermutung ist, dass beim
    echo json_encode($response);
    etwas nicht stimmt. Was muss ich ändern, damit das Ganze funktioniert?
    Danke schonmal für die Hilfe!


    verwendete ilch Version: 1.1 P


    Zuletzt modifiziert von Outi77 am 28.12.2014 - 06:53:39
    Die richtige Formulierung eines Problems ist nicht selten bereits die halbe Lösung.
    »Albert Einstein«
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    dastiii Mitglied
    Registriert seit
    27.12.2005
    Beiträge
    2.354
    Beitragswertungen
    84 Beitragspunkte
    Könnte sein, dass es am Encoding deiner Strings liegt. Diese müssen zwingend als UTF-8 encoded sein.

    PS: Entfern' mal spaßeshalber das ü in München und ersetz es durch ue. Teste es dann noch einmal.
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Outi77 Mitglied
    Registriert seit
    31.03.2013
    Beiträge
    1.337
    Beitragswertungen
    143 Beitragspunkte
    Moin dastiii,
    hab spaßeshalber das ü durch ue ersetzt und siehe da (war vorhersehbar bei so kompetenter Hilfe), es funktioniert.
    Ich habe jetzt in der function diese 2 Zeilen
    $heim = $row['hometeam_name'];
    $gast = $row['gastteam_name'];
    ersetzt durch diese:
    $heim = utf8_encode($row['hometeam_name']);
    $gast = utf8_encode($row['gastteam_name']);

    Jetzt paßt es soweit, dass mal was ausgegeben wird.
    Allerdings nicht, wie gewollt, in der Tabelle, sondern darüber.
    gesperrtes Bild
    Meine rounds.htm:
    <table width="100%" class="border">
        <tr>
            <td height="18" colspan="11" class="Cmite" align="center"><strong>Tippspiel-Verwaltung Spieltage</strong></td>
        </tr>
    </table>
    <br>
    <a class="left" href="index.php?tippspiel-admin-verwaltung">Übersicht</a>
    <a class="left" href="index.php?tippspiel-admin-user">Userverwaltung</a>
    <a class="left" href="index.php?tippspiel-admin-teams">Mannschaftverwaltung</a>
    <a class="left" href="index.php?tippspiel-admin-rounds">Spieltagverwaltung</a>
    <br>
    <br>
    <form name="form3" id="newspieltagform">
        <table cellpadding="3" cellspacing="1" border="0" class="border">
            <tr>
                <td colspan="3" style="text-align: center">Spieltage</td><td><select id="spieltage" name="spieltage">{rounds}</select></td>
            </tr>
        </table>
    </form>
    <br>
    <table cellpadding="3" cellspacing="1" border="0" class="border">
        <tr class="Cnorm">
            <td style="text-align: center" colspan="4">Spieltag</td>
        </tr>
        <tr class="Chead">
            <th style="text-align: center">#</th>
            <th style="text-align: center">Heim</th>
            <th style="text-align: center">-</th>
            <th style="text-align: center">Gast</th>
        </tr>
        <tr class="Cdark" {noentry}><td colspan="4" style="text-align: center">Noch keine Spieltage angelegt</td></tr>
        {EXPLODE} <!-- 1 -->
        <div class="spieltag">
            <tr class="{class}">
                <td>{nr}</td>
                <td>{heim}</td>
                <td>{vs}</td>
                <td>{gast}</td>
            </tr>
        </div>
        {EXPLODE} <!-- 2 -->
    </table>

    Hast Du hier vielleicht auch eine Idee?
    Danke Dir für den Tipp mit dem encode zwinker

    Nachtrag: ich vermute, ich muss mein html etwas umbauen...


    Zuletzt modifiziert von Outi77 am 28.12.2014 - 10:30:14
    Die richtige Formulierung eines Problems ist nicht selten bereits die halbe Lösung.
    »Albert Einstein«
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    dastiii Mitglied
    Registriert seit
    27.12.2005
    Beiträge
    2.354
    Beitragswertungen
    84 Beitragspunkte
    Also im Prinzip würde ich dir eh raten, das HTML Clientseitig zu erzeugen.

    Ansonsten solltest du auch kein <div> direkt in <table></table> haben, also z.B. deinen <tr>s direkt die Klasse des divs geben.

    Bzw. du könntest deiner Tabelle eine id 'spieltag' geben und per jQuery, wenn du die einzelnen Begegnungen abrufst, statt .html lieber .append, dann fügt er dein HTML ganz unten in die Tabelle ein.

    Edit: Um auf Nummer sicher zu gehen: Füg' am besten noch ein <thead></thead> sowie ein <tbody></tbody> ein, und nutz' folgenden Code um deine Zeilen anzuhängen:

    $('#spieltag > tbody:last').append(response.spieltag);

    Edit: jsfiddle.net/8tva13fd/ - ein kleines Beispiel.

    Zuletzt modifiziert von dastiii am 28.12.2014 - 11:03:24
    2 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    Outi77 Mitglied
    Registriert seit
    31.03.2013
    Beiträge
    1.337
    Beitragswertungen
    143 Beitragspunkte
    Super, vielen Dank Dir! Yes
    So wollte ich es eigentlich machen, aber naja, jetzt habe ich wieder was gelernt...
    Die richtige Formulierung eines Problems ist nicht selten bereits die halbe Lösung.
    »Albert Einstein«
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten