2011-11-03 110 views
0

首先,我需要,我可以很容易地更新,所以我創建了一個數據庫稱爲 廠家在那裏我列出製造商的形式來選擇的下拉列表。插入數據從下拉到數據庫和PHP

我最後用這個代碼來實現這一點:

<?php 
// Connect to the test datbase on localhost 
// That's where we created the countries table above 
mysql_connect('localhost','##user##','##pass##'); mysql_select_db('wordpress'); 

// Query the countries table and load all of the records 
// into an array. 
$sql = 'select * FROM manufacturers'; 
$res = mysql_query($sql) or die(mysql_error()); 
while ($rec = mysql_fetch_assoc($res)) 
$manufacturers[] = $rec; 
?> 
<form action="select.php" method="post"> 
<?php 
echo '<select name="dropdown">'; 
foreach ($manufacturers as $c) 
{ 
    if ($c['id'] == $_GET['id']) 
    echo "<option value=\"{$c['meta_id']}\" selected=\"selected\">{$c['meta_value']}    </option>\n"; 
else 
    echo "<option value=\"{$c['meta_id']}\">{$c['meta_value']}</option>\n"; 
} 
echo '</select>'; 
?> 
<input type="submit" value="Submit" name="submit"/> 
</form> 

這個工作了偉大的我現在是從我的 數據庫廠商填充的下拉列表。

現在我需要發送這對現有的數據庫調用post_meta以便從那裏我可以永久顯示在用戶的選擇。

我已經嘗試了不同的選擇,但我想使用下面的代碼發送此我post_meta數據庫。

<?php 
$con = mysql_connect("localhost","##user##","##pass##"); 
if (!$con) 
{ 
die('Could not connect: ' . mysql_error()); 
} 

mysql_select_db("wordpress", $con); 

$sql="INSERT INTO wp_postmeta (meta_id, post_id, meta_key, meta_value) 
VALUES 
('$_POST['meta_id']}','$_POST[post_id]','$_POST[meta_key]','$_POST[meta_value]')"; 

if (!mysql_query($sql,$con)) 
{ 
die('Error: ' . mysql_error()); 
} 
echo "1 record added"; 
?> 

這實際上插入數據庫,但不記錄任何值。

請幫我弄清楚我做錯了什麼。

+1

你是認真地對SQL注入攻擊敞開的。您應該考慮使用PDO學習準備好的查詢。另外,'$ _POST ['meta_id']''之後的額外括號是什麼?您是否嘗試過'print_r($ _ POST)'以確保發佈數據到達那裏? – Brad

回答

1

執行此操作的正確方法是A:轉義所有$ _POST超全局變量。
和B.寫一個查詢,如下所示。

下面是wp_postmeta的的TableDef:
http://codex.wordpress.org/Database_Description#Table:_wp_postmeta

因爲meta_id是一個auto_increment主鍵,沒有提供它,MySQL的一樣。

//$meta_id = mysql_real_escape_string($_POST['meta_id']); <<-- not needed. 
$post_id = mysql_real_escape_string($_POST['post_id']); 
$meta_key = mysql_real_escape_string($_POST['meta_key']); 
$meta_value = mysql_real_escape_string($_POST['meta_value']); 
$sql=" INSERT INTO wp_postmeta 
     (post_id, meta_key, meta_value) 
     VALUES 
     ('$post_id','$meta_key','$meta_value') "; //<<-- don't forget the quotes! 
if ($result = mysql_query($sql)) { 
    //You can get the new meta_id using: 
    $new_meta_id = mysql_insert_id($result); 
} else { 
    die ("could not insert ".mysql_error()); 
} 
+0

感謝您的幫助約翰,但我仍然面臨着同樣的問題。我得到這個錯誤通知:未定義的索引:post_id在第11行的C:\ xampp \ htdocs \ wordpress \ select.php 注意:未定義索引:meta_key in第12行的C:\ xampp \ htdocs \ wordpress \ select.php 注意:未定義的索引:meta_value位於第13行的C:\ xampp \ htdocs \ wordpress \ select.php中,但仍未找到任何數據。如果我回應結果,則表明數據正在傳遞。 – Jakeray

+0

$ _post ['x']指您的表單的字段使用這些字段來創建表單。我建議問一個新問題,如何獲得$ _post vars中的值。 – Johan

0

不顯示任何值嗎?它看起來像缺少關鍵值的引號。例如,應該不會是:

$_POST['post_id'] 

做一個全面的檢查,只是迴應你的$ _POST變量,而不是做插入的時候了。這將幫助你弄清楚你是否有一些錯誤的語法。此外,我還會閱讀Brad的評論,並留意未來。

+0

否這些值不顯示。我得到這個錯誤的所有四個值:注意:未定義索引:meta_id – Jakeray

+0

-1對於SQL注入答案。問題與他們一起散佈已經夠糟糕了。答案是不可接受的。請參閱:http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain – Johan

+0

@Johan布拉德已經指出,這就是爲什麼我在我的答案引用他的評論。我沒有意識到這還不夠,我的道歉。 –

-1

嘗試此查詢:

$sql=" 
INSERT INTO wp_postmeta 
(meta_id, post_id, meta_key, meta_value) 
VALUES 
(
    '{$_POST['meta_id']}', 
    '{$_POST['post_id']}', 
    '{$_POST['meta_key']}', 
    '{$_POST['meta_value']}' 
) 
"; 

而且,隨着人們評論說,這個代碼是非常脆弱的,請考慮尋找更好的選擇變量進入查詢。

+0

-1將'mysql_real_escape_string()'放在答案中並使用安全代碼有多難。 '顯示,別告訴'。 – Johan

+0

只有當用戶被允許從文本字段輸入數據時,sql注入才能正常工作嗎?我只允許用戶從下拉列表中選擇一個選項。 – Jakeray

+0

我在很多代碼中使用了mysql_real_escape_string(),從來沒有見過或聽說過你所描述的問題,除非你還在使用'magic_quotes'另一個大的安全失敗。如果你對PDO很重視,那很酷,因爲它是PDO規則,但在代碼示例中使用它。呵呵,你不要爲'meta_id'插入一個明確的值,它是一個auto_increment。 – Johan