2011-09-30 74 views
0

我創建了迷你內容管理系統。現在得到了當場打死問題一次向多個MySQL表中插入值

我用下面的函數

function filter($data, $db) 
{ 
    $data = trim(htmlentities(strip_tags($data))); 
    if (get_magic_quotes_gpc()) 
    $data = stripslashes($data); 
    $data = $db->escape_string($data); 
    return $data; 
} 

而且PHP代碼過濾帖子看起來像

$name=filter($_POST['name'], $db); 
$title=filter($_POST['title'], $db); 
$parent=filter($_POST['parent'],$db); 
$switch=filter($_POST['switch'], $db); 
    if($switch=''){ 
     echo "Return back and select an option"; 
     die(); 
    } 
$parentcheck=filter($_POST['parentcheck'],$db); 
    if($parentcheck=='0') 
    { 
     $parent=$parentcheck; 
    } 
$purifier = new HTMLPurifier(); 
$content = $db->real_escape_string($purifier->purify($_POST['content'])); 

if(isset($_POST['submit'])&&$_POST['submit']=='Ok'){ 
    $result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$switch'") or die($db->error); 
    $result2=$db->query("INSERT INTO pages (id, title, content) VALUES ('<what?>', '$title', '$content'") or die($db->error);   
    } 

這就是我的表看起來怎麼樣命名

表「pages」 enter image description here

和 「菜單」

enter image description here

我的問題是如下:


  1. 我試圖讓自動遞增id值從menu表後 ('$parent', '$name', '$switch'")插入並將此id in pages表 插入時($ title,$ content)。怎麼做?是否可以使用單個 查詢?

  2. $content的值是帶有HTML標籤的文本。我正在使用html淨化器。 我可以在插入數據庫表之前過濾它的值嗎?任何 建議/建議?

+0

你在尋找mysql_insert_id()函數嗎? –

回答

1

應該使用real_escape_string是

$result2=$db->query("INSERT INTO pages (id, title, content) VALUES (LAST_INSERT_ID(), '$title', '$content'") or die($db->error); 

過濾()應該是安全的。是否還有其他要過濾的內容?

1

看起來您使用的是mysqli作爲數據庫庫,因此您可以使用$db->insert_id()來檢索由該特定DB句柄的插入操作創建的最後一個ID。所以,你的查詢會變成:

$result=$db->query("INSERT INTO menu (parent, name, showinmenu) VALUES ('$parent', '$name', '$switch'") or die($db->error); 
$new_id = $db->insert_id(); 
$result2=$db->query("INSERT INTO pages (id, title, content) VALUES ($new_id, '$title', '$content'") or die($db->error);   
                    ^^^^^^^ 

你真的不能做一個單一的查詢,如MySQL不使其可用於INSERT_ID功能的ID值後直到查詢完成。所以你必須在3個步驟中做到這一點:插入,獲取ID,再次插入。

數據庫過濾規則(更好地稱爲轉義)是轉義用戶提供的任何東西。這甚至包括您在其他數據庫查詢中檢索並重新插入的數據。轉義並不是真正的安全措施 - 它確保無論您將哪些內容放入查詢字符串中,都不會導致查詢失敗。防止SQL注入攻擊只是一個副作用。

+0

你讀過我的'filter'函數的代碼了嗎? $ content的值是帶有HTML標籤的文本。我也想過濾'$ content'。任何關於將html標記插入db的建議? – demonoid

+0

Purifier與將HTML插入數據庫無關。淨化器只是清理html。您想如何存儲數據以及之後將要使用的數據取決於您。但淨化器本身不足以使某些任意的html安全地用於數據庫使用。他們是兩種完全不同的使用情況。比較蘋果和長頸鹿。 –

+0

在將html插入數據庫表之前,你會建議做什麼? – demonoid