Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Fehlerhafte MySQL-Ausgabe - [Select] nach [Insert]

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Fehlerhafte MySQL-Ausgabe - [Select] nach [Insert]

    Hallo zusammen,

    bei meinem kleinen Projekt arbeite ich mit PHP und MySQL sowie JavaScript.

    Ausgangssituation:
    Es wird stets eine Karte mit Verbindungslinien zwischen Städten angezeigt. Diese Karte und Linien werden mit JavaScript erzeugt, wobei nur die Linien aus der MySQL-Datenbank importiert werden. Der Code für die Linien steht also in den Feldern der Datenbank.

    Das funktioniert soweit ohne Probleme.

    Problembeschreibung:
    In dem Moment, wo eine neue Linie in die Datenbank eingetragen wird - das passiert im Quellcode VOR der Erzeugung der Karte, erzeugt die nach dem Insert durchgeführte Select-Abfrage der gleichen Datenbank nur einige unlesbare Zeichen und evtl. Anfangsbuchstaben.

    Statt
    Code:
    L.polygon([[51.504225397481, 7.48365411122495],[51.220507741497, 6.81216996826174]]).addTo(map).bindPopup("Verbindung zwischen Dortmund und Düsseldorf");
    wird nur
    Code:
    L
    oder eben ein unlesbares Zeichen ausgegeben.

    Kann man überhaupt direkt nach einem Insert ein Select durchführen? mysql_error gibt keine Fehlermeldung aus und sobald ich die Seite aktualisiere wird alles richtig angezeigt.

    Wie löse ich das Problem? Ich bin für alle Vorschläge dankbar, da mir das Netz mit entsprechenden Suchanfragen nicht weiterhelfen konnte.

    Die Insert-Anfrage:
    PHP-Code:
        $link_code "L.polygon([[".$CC_lat_new.", ".$CC_lon_new."],[".$CC_lat_old.", ".$CC_lon_old."]]).addTo(map).bindPopup(\"Verbindung zwischen ".$CC_city_name[0]." und ".$CC_city_select."\");";
        
        
    $marker_code "L.marker([".$CC_lat_new.", ".$CC_lon_new."]).addTo(map).bindPopup(\"<p>Standort<br><b>".$CC_city_name[0]."</b></p>\");";
        
        if(
    $CC_lat_new!=$CC_lat_old){
            
    $insert_new_city mysql_query("INSERT INTO projectdata (username, project, location, loc_id, cityrank, link, link_code, marker_code) VALUES ('$username', '$CC_company_select', '$CC_city_name[0]', '$CC_select_new_city_loc_id', '0', '$CC_city_select', '$link_code', '$marker_code')") OR die("Error: $insert_new_city <br>".mysql_error());
        } 
    Die anschließende Select-Abfrage:
    PHP-Code:
        <?php 
        $result_map_projection 
    MYSQL_QUERY("SELECT * FROM projectdata WHERE username='$username' AND project='$company_select'") OR die("Error: $result_map_projection <br>".mysql_error());
        
        
    $i=0;
        
        while (
    $map_projection mysql_fetch_array($result_map_projection))
        {
            
    $link_code[$i] = $map_projection['link_code'];
            echo 
    $link_code[$i];
            echo 
    "\n";
            
    $marker_code[$i] = $map_projection['marker_code'];
            echo 
    $marker_code[$i];
            echo 
    "\n";
            
    $i++;
        }
        
        
    ?>
    Falls noch der restliche (viele) Code gebraucht wird, füge ich ihn gerne ein.

    Vorab vielen Dank und viele Grüße!

    (Veraltet) Edit:
    Interessanterweise werden genauso viele einzelne "L" erzeugt, wie ausgegeben werden müssten. Es scheint also so, als würde tatsächlich nur der Anfangsbuchstabe ausgegeben. Zusätzlich erscheinen vor den "L" einige (nicht gleich viele) unlesbare Zeichen!


    Edit 2:
    Es hat sich bestätigt: Es wird immer nur der Anfangsbuchstabe nach dem Insert und dem anschließenden Select ausgegeben!

    Problemlösung:
    Doppelt vergebene Variablennamen waren das Problem.
    In diesem Fall waren das:
    PHP-Code:
    $link_code[$i]
    $marker_code[$i
    Diese beiden Variablen waren demnach schon vergeben, was wohl zu dem Resultat eines auf den Anfangsbuchstaben verkürzten Outputs führte.

  • #2
    Zitat von amen. Beitrag anzeigen
    H

    Kann man überhaupt direkt nach einem Insert ein Select durchführen?
    Na sicher, zumindest in PG:

    Code:
    test=# select * from foo;
     id | col1 | col2
    ----+------+------
      1 | bla  |
      2 | bubb |
      3 |      |
    (3 rows)
    
    Time: 0,178 ms
    test=*# with neu as (insert into foo values (1,'eins','zwei') returning *) select * from neu;
     id | col1 | col2
    ----+------+------
      1 | eins | zwei
    (1 row)
    test=*# select * from foo;
     id | col1 | col2
    ----+------+------
      1 | bla  |
      2 | bubb |
      3 |      |
      1 | eins | zwei
    (4 rows)
    Edit:
    Interessanterweise werden genauso viele einzelne "L" erzeugt, wie ausgegeben werden müssten. Es scheint also so, als würde tatsächlich nur der Anfangsbuchstabe ausgegeben. Zusätzlich erscheinen vor den "L" einige (nicht gleich viele) unlesbare Zeichen!
    Shit in, shit out. Vermutlich gibst Du schon Müll ein. Was für ein Datentyp eigentlich?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Der Datentyp von marker_code und link_code ist jeweils "text" und die kollation "utf8_german2_ci".

      Shit in, shit out. Vermutlich gibst Du schon Müll ein.
      Wenn dem so wäre, würde es ja nicht beim Neuladen der Seite funktionieren.

      Zusätzliche Info:
      Es wird nach dem Insert tatsächlich immer nur der Anfangsbuchstabe aller Datenbankfelder ausgegeben.

      Wann passiert so etwas?

      Kommentar


      • #4
        Zitat von amen. Beitrag anzeigen
        Wann passiert so etwas?

        Kapotte Datenbank? MySQL, you know?
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Das kommt von uninitialisierten Variablen. Lass dir die Notices anzeigen und du siehst wo der Fehler ist.

          Kommentar


          • #6
            Zitat von akretschmer Beitrag anzeigen
            Kapotte Datenbank? MySQL, you know?
            Die Datenbank ist kerngesund.

            Ich konnte das Problem nun lösen. Die Outputvariablennamen habe ich versehentlich doppelt vergeben.

            PHP-Code:
            $link_code[$i]
            $marker_code[$i
            Diese beiden Variablen waren demnach schon vergeben, was wohl zu dem Resultat eines auf den Anfangsbuchstaben verkürzten Outputs führte.

            Ich möchte mich trotzdem bei akretschmer und erc für die Hilfe bedanken!

            Kommentar

            Lädt...
            X