2009-06-25 78 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')";