2009-06-25 77 views
0

我有一系列的複選框被出來一個MySQL表的:多個動態生成的複選框

<?php 
    $result = mysql_query("SELECT * FROM strategies"); 
    if (!$result) { 
    die("Database query failed: " . mysql_error()); 
    } 
while($row = mysql_fetch_array($result)) { 
    $strategylist = $row['name']; 
    $strategyname = htmlspecialchars($row['name']); 
    echo '<input type="checkbox" name="strategy[]" value="' . $strategylist . '" />' . $strategyname; 
} 
?> 

我希望能夠存儲多個「戰略」到每一行上「學習」表,所以我正在使用另一個表(sslink)來存儲研究的ID和策略的名稱。這部分是因爲會有越來越多的「策略」,所以他們需要存儲在數據庫中。這是我目前使用的代碼:

<?php 



if(isset($_POST['update1'])) 
{ 
    $strategy=serialize($_POST['strategy']); //line 66, where the warning is happening 

    if(!get_magic_quotes_gpc()) 
    { 
     $strategy = addslashes($strategy); 
    } 

    // update the article in the database 
    $query ="INSERT INTO sslink('study_id', 'strategyname') VALUES ('".$_GET['id']. "', '" .$strategy. "')"; 

    mysql_query($query) or die('Error : ' . mysql_error()); 

    $cacheDir = dirname(__FILE__) . '/cache/'; 

    $cacheFile = $cacheDir . '_' . $_GET['id'] . '.html'; 

    @unlink($cacheFile); 

    @unlink($cacheDir . 'index.html'); 

    echo "<b>Article '$title' updated</b>"; 

     $strategy = stripslashes($strategy); 
} 


?> 

這是獲取返回的錯誤:行66 錯誤策略/casestudyform.php:

公告:未定義的索引您有一個您的SQL語法錯誤;檢查與你的MySQL服務器版本相對應的手冊,在''study_id','strategyname'附近使用正確的語法)在第1行的VALUES('1','N;')'

有誰知道如何解決這個問題?或更好的方式來做到這一點?

在此先感謝!

回答

1

試試這個:


$query ="INSERT INTO sslink (study_id, strategyname) VALUES ('".$_GET['id']. "', '" .$strategy. "')"; 
+0

在SQL中使用它們之前,請記住要轉義$ _GET請求參數! – 2009-06-25 17:55:33

0

未定義指數表明,$ _ POST [ '戰略']沒有設置。你可以做一個健全的檢查,你的表格有嗎?此外,實際查詢的回聲會很好。

0

你有兩個錯誤是互不相干:

公告:未定義的索引:在/casestudyform.php在線66

由於@montooner指出的策略,此通知來自PHP,因爲$_POST數組不包含'strategy'密鑰的值。也就是說,表單未提交策略複選框。在嘗試引用它之前,您應該測試該密鑰是否存在。

if (array_key_exists('strategy', $_POST)) ... 

錯誤:你在你的SQL語法錯誤;檢查對應於您的MySQL服務器版本的正確的語法使用「」附近study_id「‘strategyname’)VALUES(‘1’,手動‘N;’)」位於第1行

這是一個SQL解析錯誤。您在INSERT語句中的列周圍放置了單引號。在SQL中,單引號分隔字符串常量,而不是列名。

如果您需要爲列名分隔(因爲它們包含SQL關鍵字,空格,特殊字符等),您應該在MySQL中使用反引號或在ANSI SQL中使用雙引號。

還要小心SQL注入。不要認爲HTTP請求參數只包含整數或友好字符串。 Filter這些值或escape它們在SQL中使用它們之前。 addslashes()函數不是防止SQL注入的好方法。

$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); 
$strategy_esc = mysql_real_escape_string($strategy); 
$query ="INSERT INTO sslink(`study_id`, `strategyname`) 
    VALUES ($id, '$strategy_esc')";