Andreas Korthaus: /PHP: Problem mit dynamischer SQL-Abfrage

Hallo!

Ich versuche einen eigenen Dump zu erzeugen, ich kann keinen Standard-nehmen da ich zm einen nicht alle Datensätze benötige, des weiteren nicht alle Felder. Da ich das für einige Tabellen machen muß habe ich das ganez in einige Funktionen gepackt. Dabei habe ich jetzt 2 Probleme:

1. Warum werden Umbüche in Textfeldern nicht als \n angezeigt sondern im Browser und auch im Quelltext "ausgeführt" - trotz addslashes()?!

2. Das etwas schwierigere Problem, welches ich nicht so ganz verstehe: Es fehlt immer der 1. und letzte Datensatz bei der $insert_query asl INSERT-Statement, dafür ist der letzte Datensatz danach in der $update_query als UPDATE-Statement, obwohl hier ebenfalls alle Datensätze als Update stehen müßten?!

Mal mal das Script mit den beiden wichtigen Funktionen, die anderen liefern korrekte Werte:

<?php

$link=@mysql_pconnect($host,$usr,$pw);
mysql_select_db($db,$link);

function query($sql){
    global $link;
    $result = mysql_query($sql,$link);
    return $result;
}

function get_table_data($table){
    global $from_col_name;
    $primary_key_col_name = get_primary_key_col_name($table);
    $timestamp_col_name = get_timestamp_col_name($table);

$insert_query = "INSERT INTO ".$table." (".get_cols($table).") VALUES";

$result = query("SELECT ".get_cols($table)." FROM ".$table);
    while($row=mysql_fetch_assoc($result)){
        $insert_query .= "\n(";
        foreach ($row as $value){
            $insert_query .= "'".addslashes($value)."',";
        }
        $insert_query = substr($insert_query,0,-1);
        $insert_query .= "),";
    }
    $insert_query = substr($insert_query,0,-1).";";

$result = query("SELECT ".$primary_key_col_name.",".get_cols($table)." FROM ".$table);
    while($row=mysql_fetch_assoc($result)){
        $update_query = "\nUPDATE ".$table." SET ";
        foreach ($row as $key => $value){
            if ($key != $primary_key_col_name){
                $update_query .= $key."='".addslashes($value)."',";
            }
        }
        $update_query = substr($update_query,0,-1);
        $update_query .= " WHERE ".$primary_key_col_name." = '".$row[$primary_key_col_name]."';";
    }
    return "\n".$insert_query."\n\n".$update_query."\n";
}

print_r(get_table_data("s_objekte"));

?>

Ich hab einiges weggelassen, aber es stehen schon alle Daten zur Verfügung. Aus irgendeinem Grund wird die Tabelle "s_objekte" nur einmal abgefragt, der erste Datensatz verschluckt, alle bis auf den letzten als insert in $insert_query geschrieben, und der letzte als Update-Statement in $update_query. Verwende ich denn die Funktionen irgendwie falsch? Irgendwas stimmt da nicht! Das ganze ist eigentlich viel komplizierter, aber ich habe es so weit wie möglich vereinfacht, bin dem Problem aber nicht näher gekommen. Hat jemand ne Idee?

Viele Grüße
Andreas

PS: Wenn ich den Update Teil weglasse, fehlt halt dieser in der Ausgabe, es bleibt dabei das beim Insert Teil der erste und letzte Datensatz fehlen

  1. Hallo!

    Ein Punkt, ein kleiner Punkt hat das 2. Problem verursacht..., naja, aber das erste Problem bekomme ich nicht in den Griff.
    Wenn mySQLdump oder phpMyAdmin einen dump erstellt habe ich in den Insert-Anweisungen immer \n für die Umbrüche stehen - ausgeschreiben, das steht so in der Datei. Aber wenn ich das Feld per PHP auslese, ob mit addslashes oder ohne, dann werden  keien Umbrüche angezeigt, sondern es wird direkt umgebrochen. Wie kann ich s schaffen das mit die Umbrüche korrekt angezeigt werden, bzw. in eine Datei geschreiben werden? Wie gesagt, hat nichts mit nl2br() zu tun, einfach nur \n ausgeben wo es auch steht.

    Viele Grüße
    Andreas

    1. Hallo,

      Ein Punkt, ein kleiner Punkt hat das 2. Problem verursacht..., naja, aber das erste Problem bekomme ich nicht in den Griff.
      Wenn mySQLdump oder phpMyAdmin einen dump erstellt habe ich in den Insert-Anweisungen immer \n für die Umbrüche stehen - ausgeschreiben, das steht so in der Datei. Aber wenn ich das Feld per PHP auslese, ob mit addslashes oder ohne, dann werden  keien Umbrüche angezeigt, sondern es wird direkt umgebrochen. Wie kann ich s schaffen das mit die Umbrüche korrekt angezeigt werden, bzw. in eine Datei geschreiben werden? Wie gesagt, hat nichts mit nl2br() zu tun, einfach nur \n ausgeben wo es auch steht.

      z.B. mit str_replace:

      $value = str_replace ("\n", "\n", $value);

      Grüße,

      Christian

      1. Hi!

        z.B. mit str_replace:

        $value = str_replace ("\n", "\n", $value);

        addslashes() macht doch nichts anderes, oder? Nur vermutlich erheblich performanter(was sehr wichtig ist denn bei 100 Datensätzen mit 20 Spalten wären das mal eben 2000 RegExprs in einer Schleife).

        Ich habe es trotzdem versucht, aber auch das funktioniert nicht.

        nl2br($value) funktioniert jedenfalls, aber das will ich ja gar nicht!
        str_replace ("<br />", "\n",nl2br($value))  entfernt zwar die <br />, aber dafür sind die \n wieder in echte Zeilenumbrüche umgewandelt?!?!?

        Was soll ich davon halten? Ich muß dazu sagen, das es sich beim Server um Win2K handelt, genauso bei meinem Rerchner, ich verwende Mozilla. Aber PHPmyadmin schreibt die \n bzw. \n\r korrekt, auch im Mozilla!  Gibts das? Uch im Quelltext, keine \n!

        Was mache  ich faslch?

        Grüße
        Andreas

        1. Hallo,

          1. Addslashes kümmert sich _nicht_ um \n sondern nur um ', " und .

          Ich habe es trotzdem versucht, aber auch das funktioniert nicht.

          Verstehe ich nicht - ich habe selbst mit folgender PHP-File das getestet:

          echo str_replace ("\n", "\n", "Dies
          ist
          ein
          Test!");

          str_replace ("<br />", "\n",nl2br($value))

          str_replace ("<br />", "\n",nl2br($value))

          Was soll ich davon halten? Ich muß dazu sagen, das es sich beim Server um Win2K handelt, genauso bei meinem Rerchner, ich verwende Mozilla. Aber PHPmyadmin schreibt die \n bzw. \n\r korrekt, auch im Mozilla!

          Daher könnte der Zeilenumbruch \r\n sein ... Ahhhh .... Dann musst Du folgendes tun:

          echo str_replace ("\r\n", "\n", $feld);

          Was mache  ich faslch?

          \n ist ja der Zeilenumbruch selbst. Wenn Du die "Zeichenkette" \n haben willst, dann musst Du \n schreiben.

          Grüße,

          Christian

          1. Hi!

            Daher könnte der Zeilenumbruch \r\n sein ... Ahhhh .... Dann musst Du folgendes tun:

            echo str_replace ("\r\n", "\n", $feld);

            PERFEKT! Vielen Dank!

            Was mache  ich faslch?

            \n ist ja der Zeilenumbruch selbst. Wenn Du die "Zeichenkette" \n haben willst, dann musst Du \n schreiben.

            Eigentlich weiß ich das, ist wohl nicht mein Tag heute ;-) Aber ich habe viel gesucht, und immer bin ich nur auf nl2br() - Hinweise gestoßen.

            Eine Frage, wenn ich jetzt in einer schleif idn die wiederum in einer Schleife insgesmt 2000 mal str_replace ("\r\n", "\n", addslashes($value)) verwende, muß man sich da Gedanken von wegen performance machen?

            Viele Grüße
            und Danke nochmal!

            Andreas

            1. Hallo,

              Eine Frage, wenn ich jetzt in einer schleif idn die wiederum in einer Schleife insgesmt 2000 mal str_replace ("\r\n", "\n", addslashes($value)) verwende, muß man sich da Gedanken von wegen performance machen?

              Bei 2000 str_replace ist die Welt noch in Ordnung. Erst wenn es dann 2.000.000 werden, könnte es problematisch werden ;-)

              Notfalls kannst Du ja mal einer Timermessung machen ...

              Grüße,

              Christian

              1. Hi Christian!

                Danke Dir für die Hilfe, zumindest der Teil meines Scriptes funktioniert jetzt prima ;-)

                Grüße
                Andreas