PHP / MySQL中多个动态生成的复选框

时间:2009-06-25 17:21:10

标签: php mysql

我有一系列复选框来自一个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;')'

有谁知道如何解决这个问题?还是更好的方法呢?

提前致谢!

3 个答案:

答案 0 :(得分:1)

试试这个:


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

答案 1 :(得分:0)

未定义的索引表明未设置$ _POST ['strategy']。你可以做一个完整性检查你的表格吗?此外,实际查询的回声会很好。

答案 2 :(得分:0)

您有两个彼此无关的错误:

  

注意:未定义的索引:第66行/casestudyform.php中的策略

正如@montooner所指出的,此通知来自PHP,因为$_POST数组不包含'strategy'键的值。也就是说,表单已提交,未选中策略复选框。在尝试引用密钥之前,您应该测试密钥是否存在。

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

  

错误:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在''study_id','strategyname'附近使用正确的语法。)第1行的VALUES('1','N;')'

这是一个SQL解析错误。您已在INSERT语句中的列周围放置单引号。在SQL中,单引号分隔字符串常量,而不是列名。

如果需要分隔列名(因为它们包含SQL关键字,空格,特殊字符等),则应使用MySQL中的反引号或ANSI SQL中的双引号。

还要注意SQL注入。不要假设HTTP请求参数只包含整数或友好字符串。在SQL中使用它们之前,Filter值或escapeaddslashes()函数不是防止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')";