2009-11-11 92 views
1

有没有一种方法可以格式化一个列表,以便我可以通过SQL插入它?使用PHP格式化文本

我目前的列表格式是test:test,我希望能够格式化它,以便将其插入到我的数据库中。

INSERT INTO `test` (`user`, `file`) VALUES 
('test', 'test'), 
('test2', 'test2'), 
('[email protected]', 'test3'); 

这是可能的吗?

<? 
if($_POST['oldlist']){ 

$sql = "SELECT * FROM test WHERE user='$_POST[oldlist]'"; 
$result = mysql_query($sql) or die(mysql_error()); 
if(mysql_num_rows($result) > 0) { echo "exists";} else { 

$sqlq = "INSERT INTO test (`user` ,`file`) 
VALUES ('$_POST[oldlist]');"; 
$add = mysql_query($sqlq) or die(mysql_error()); 
if($add){echo "done";}else {echo "failed";} 
}} 
?> 

这是什么意思?我希望能够发布一个列表并将其插入到我的数据库中,但它必须先格式化。

+0

注意SQL注入! – Asaph 2009-11-11 04:50:36

+0

这是我个人使用的,没有任何公开的。 – Homework 2009-11-11 04:51:10

+0

你可以在php中使用explode()。 – sathish 2009-11-11 04:52:34

回答

2

你的代码中有一个令人讨厌的SQL注入漏洞。确保你逃避你的价值!以下是我建议你逃避你的代码,并将其插入到你的数据库:

<?php 
// Use isset to determine whether there is a value present 
if(isset($_POST['oldlist'])){ 

    $oldlist = $_POST['oldlist']; 
    // Escape your data. Makes sure someone inject code that can jack your DB 
    $oldlist_esc = mysql_real_escape_string($oldlist); 

    $sql = "SELECT * FROM test WHERE user='$oldlist_esc'"; 
    $result = mysql_query($sql) or die(mysql_error()); 
    if(mysql_num_rows($result) > 0) 
     echo "exists"; 
    else { 
     // I'll assume your data is line-delimited 
     $oldlist = explode("\n", $oldlist); 
     $new_oldlist = $oldlist; 
     foreach($oldlist as $key=>$value) { 
      $new_oldlist[$key] = explode(" ", $value, 1); // I'll assume each line is space-delimited 

      // Escape the new data 
      foreach($new_oldlist[$key] as $new_key=>$new_value) 
       $new_oldlist[$kew_key] = mysql_real_escape_string($new_value); 
     } 
     $sqlq = "INSERT INTO test (`user` ,`file`) VALUES "; 

     // Build out the query 
     $c = 0; 
     foreach($new_oldlist as $value) { 
      if($c++ > 0) $sqlq .= ','; 
      $sqlq .= '("'; 
      $sqlq .= implode('","', $value); 
      $sqlq .= '")'; 
     } 

     $add = mysql_query($sqlq) or die(mysql_error()); 
     if($add) 
      echo "done"; 
     else 
      echo "failed"; 
    } 
} 

?> 

它的优良使用内部字符串变量(即:“asdfasdf MYVAR $ asdfasdf”),但要记住使用mysql_real_escape_string逃脱你的数据。这样可以防止用户注入数据,例如:

';DELETE FROM test WHERE true;-- 

这会有效擦除数据库。希望这可以帮助!

1

如果你的$ _POST一个数组里面一些配对值,试图通过爆炸的每个数组的元素的“:”,用正确的语法加入他们的单个插入,再加入整个阵列的多重插入:

<? 
// Just added 'olduser' as it seemed to go with WHERE user=... , change to your needs 
if($_POST['olduser'] && $_POST['oldlist']){ 

$sql = "SELECT * FROM test WHERE user='$_POST[olduser]'"; 
$result = mysql_query($sql) or die(mysql_error()); 
if(mysql_num_rows($result) > 0) { echo "exists";} else { 

foreach ($_POST['oldlist'] as &$each) 
{ 
    $each = explode(":",$each); 
    $each = "('".join("','",$each)."')"; 
} 

$_POST['oldlist'] = join(",",$_POST['oldlist']); 

// no semi-colon at end 
$sqlq = "INSERT INTO test (`user` ,`file`) VALUES $_POST[oldlist]"; 
$add = mysql_query($sqlq) or die(mysql_error()); 
if($add){echo "done";}else {echo "failed";} 
}} 
?> 

无论如何,要小心你的陈述,我不会保留它,即使在本地使用时也不会消毒查询。