2009-11-11 6 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

+0

내 개인적인 용도로 사용하며 공개 할 필요가 없습니다. – Homework

+0

PHP에서 explode()를 사용할 수 있습니다. – sathish

답변

2

코드에 불쾌한 SQL 삽입 결함이 있습니다. 당신이 당신의 가치를 벗어 났는지 확인하십시오! ("$ myVar에 asdfasdf asdfasdf"즉 :)를

<?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"; 
    } 
} 

?> 

그것은 문자열 내부 변수를 사용해도 괜찮지 만, 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";} 
}} 
?> 

어쨌든 귀하의 진술에주의하십시오. 어쨌든 귀하의 진술에주의하십시오, 나는 로컬 사용을 위해 심지어 쿼리를 sanitizing하지 않고 보관하지 않습니다.

관련 문제