Alex: (PHP) SQL-Dump aus Textarea ausführen

Beitrag lesen

Hallo dedlfix,

Nein, da liegst du nicht richtig. \ wird zu einem einfachen \ aufgelöst. Das dahinterkommende " ist der Abschluss einer mit " begonnen Zeichenkette.

So etwas wäre aber doch ungültiger SQL-Code:
INSERT INTO table VALUES (\'hallo');

Bin ich dann nicht doch auf der richtigen Seite, wenn ich alle ', vor denen mindestens ein Backslash steht als "Quote innerhalb eines Eintrags" werte?

Hier mal meine erste Bastelei:

  
<?php  
function split_sql($sql)  
 {  
  // Kommentare und leere Zeilen aussortieren:  
  $lines = explode("\n", $sql);  
  $cleared_lines = array();  
  foreach($lines as $line)  
   {  
    $line = trim($line);  
    if($line != '' && substr($line,0,1)!='#') $cleared_lines[] = $line;  
   }  
  // Zeilen zu einem String verbinden:  
  $sql = stripslashes(implode('',$cleared_lines));  
  $delimiter = ';';  
  // am Trennzeichen aufspalten:  
  $queries = explode($delimiter, $sql);  
  $query_count = count($queries);  
  // schauen, ob innerhalb eines Eintrags gespaltet wurde:  
  for ($i = 0; $i < $query_count; $i++)  
   {  
    unset($j);  
    $quotes_count_total = substr_count($queries[$i],"'");  
    $escaped_quotes_count = substr_count($queries[$i],"\'");  
    $unescaped_quotes_count = $quotes_count_total - $escaped_quotes_count;  
    if($unescaped_quotes_count%2!=0)  
     {  
      // ungerade Anzahl nicht escapter Quotes - Eintrag gespaltet!  
      $query = $queries[$i];  
      for($j = $i+1; $j < $query_count; $j++)  
       {  
        // nächste Zeilen mit Trennzeichen hinzufügen, bis Query komplett:  
        $query .= $delimiter . $queries[($j)];  
        $quotes_count_total = substr_count($query,"'");  
        $escaped_quotes_count = substr_count($query,"\'");  
        $unescaped_quotes_count = $quotes_count_total - $escaped_quotes_count;  
        if($unescaped_quotes_count%2==0)  
         {  
          // Anzahl nicht escapter Quotes gerade - Query OK!  
          break;  
         }  
       }  
     }  
    else  
     {  
      $query = $queries[$i];  
     }  
    // zu $i die Zeilen dazuzählen, die übersprungen werden sollen:  
    if(isset($j)) $i = $i + $j;  
  
    $query = trim($query);  
    if($query != '') $sql_array[] = $query;  
  
   }  
  return $sql_array;  
 }  
?>  

Grüsse
Alex