2011-08-16 45 views
0

上午SO,消毒一個POST陣列INSERT查詢

我有一個複選框陣列(名稱=「貓[]」),其中在現有的,包含六個值,1- 6(它可以包含更多的表單在將來)。用戶可以選擇其中的任意數量。

$_SESSION['cat'] = $_POST['cat']; 

(他們是在一個會話,因爲有一兩步實際插入查詢之前)

我想要做的是它們進行消毒:

然後將這些值在收集。我已經嘗試

$_SESSION['cat'] = (int)$_POST['cat']; 

但是,似乎剝奪了它的所有值。

有人可以幫助使用適當的方法消毒這個安全插入數據庫?

在此先感謝一如既往, 丹

+1

什麼都是這樣的價值?他們都是數字嗎?你如何「消毒」他們?從你所問的問題看來,你看起來像是將一個數組('cat []')轉換爲一個整數,不會產生整數數組,它只會產生一個整數。你需要通過它循環,或用戶像array_walk()... – DaveRandom

+0

嗨Dave,數組確實包含(最多)六個值,1,2,3等等等。這些涉及到toxi解決方案中的唯一ID爲我的數據庫中的標籤。目前這種做法很好,但是消毒(或試圖)已經停止了它的工作。在我的插入查詢中,我通過它們全部循環。 – Dan

+0

(參考):另請參見:[php過濾器函數](http://www.php.net/manual/ref.filter.php)特別是[filter_input_array](http://www.php.net/ manual/efunction.filter-input-array.php) – Yoshi

回答

1

簡單的解決方案

$values = array_map('intval',$_POST['cat']); 

但是,這將導致以0代替,而不是刪除所有非整數值。

更好的解決方法是使用prepared statments(我累了,告訴它在每個崗位關於MySQL插入... :)),像這樣:

$stmt = $pdo->prepare("*your query with params replaced with ?*"); 
foreach ($_POST['cat'] as $cat){ 
    //check that $cat is integer. 
    if ($cat === 0 || (!empty(intval($cat))) 
     $stmt->execute(array($cat)); 
} 

這種方式,您將有雙重保護:你檢查int自己和PDO在sql語句中正確使用它。

+0

哈哈,每個人都告訴我要使用PDO,但是我一直在迴避,因爲我只是想讓我的頭靠近這個!我想我會潛入並給你一個去約翰,謝謝:) – Dan

+0

呵呵,只是爲了破壞你的決定:[新的mysql引擎支持準備語句和麪向對象的風格](http://www.php .net/manual/en/mysqli.prepare.php) – J0HN

0

如果以安全你的意思是所有的整數:

foreach ($_POST['cat'] as $key => $value) { 
    $_SESSION['cat'][] = int()$value; 
} 

否則,您可以用mysql_real_escape_string($value)更換int()$value

固定錯字

+0

我嘗試過real_escape_string Devator,但它似乎也刪除了所有的值(數字1-6)。它們都應該是整數。我只是想確保他們是安全的插入。 – Dan

+0

它們全都變空了,因爲你在整體上消毒陣列。這就是爲什麼我使用foreach循環來逐一清理它們。 你也應該使用'mysql_real_escape_string'而不是int。 – Devator

+0

該代碼將導致*後任何*變量轉換爲int並附加到$ _SESSION ['cat'] – J0HN

0

$_POST['cat']有什麼樣的價值觀?我假設你想要它是一個整數,但如果它不是,它會在輸出到int時吐出零。

確保您的HTML中的value=""實際上包含整數。沒有複選框HTML,我不能說更多。

+0

對不起JW,從每個複選框發佈的值是'1','2','3'等。我只是想確保它們是'安全'的(我的其他帖子條目使用了escape-string)。 – Dan

+0

奇怪的是,你沒有獲得任何東西從鑄造到詮釋。要回答你的問題,是的,投射到一個整數是完全安全的;任何其他的東西(字符等)將被過濾掉。 – Bojangles

0

您可以使用mysql_real_escape_string來確保字符串不會生成SQL錯誤,然後使用php intval函數確保從字符串中獲取整數值。

0

PHP:

if ($_POST['submit']) { 
    foreach ($_POST['cat'] as $key => $value) { 
     $_SESSION['cat'][] = intval(mysql_real_escape_string($value)); 
    } 
} 

if (isset($_SESSION['cat'])) { 
    foreach($_SESSION['cat'] as $cat) { 
     echo "Cat: $cat<br />"; 
    } 
} 

HTML:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
    1 <input name="cat[]" type="checkbox" value="1" /><br /> 
    2 <input name="cat[]" type="checkbox" value="2" /><br /> 
    3 <input name="cat[]" type="checkbox" value="3" /><br /> 
    <input type="submit" value="submit" name="submit" /> 
</form> 
+0

嗨馬特,這也適用,但它由於某種原因返回值兩次。即如果我選擇1,3和5,它返回1,3,5,1,3,5 – Dan

+0

我不確定爲什麼會發生,是否有可能看到您使用的HTML和PHP代碼?你是否在其他地方改變$ _SESSION變量? – Mat

+0

嗨,墊,以及以上是在'預覽'頁上,我有實際的插入頁面:foreach($貓爲$ item){$ sql =「query」; $ result = mysql_query($ sql);}我看不到我正在改變它 – Dan