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