【问题标题】:Insert multiple checkbox answers into database将多个复选框答案插入数据库
【发布时间】:2015-04-21 12:04:35
【问题描述】:

我有一个复选框列表,我想将每个选中的项目插入数据库。因为它是一个复选框,所以我只有一个值要传递给数据库,但我还传递了一个从以前的数据库插入中抓取的变量(主键)。

我的问题是我无法将其发布到数据库。我通过这里的帖子尝试了多种方法来做到这一点,但似乎没有任何效果。我很茫然。我对 PHP 和 mysqli 也很陌生,所以我确信有更好的方法来做我想做的事情,所以请帮助我。

该表由三列(school_id、graduate_id、schoolName)组成。 school_id 是 AI 主键,graduate_id 将使用从上一个查询中获取的变量 $graduateID 填充。 这是我所拥有的:

if (isset($_POST['school'])) {
$school=$_POST['school'];
$schoolQuery="";
foreach($school as $value) {
    if(!$schoolQuery) {
        $schoolQuery="INSERT INTO schoolReunion (graduate_id, schoolName) VALUES ($graduateID, '$value')";
    } else {
        $schoolQuery .= ", ($graduateID, '$value')";
        mysqli_store_result($schoolQuery);
    }
}
$schoolQuery .=";";
if (mysqli_multi_query ($schoolQuery)) {
    echo "Files have been updated successfully.";
} else {
    echo "Error: " . $schoolQuery . "<br/>" . mysqli_error($dbc);
}

}

当错误代码打印出来时,它看起来很好,但它不会发布任何内容并且不会给我任何错误。你能帮助我吗?

【问题讨论】:

  • 你的前端表单是什么样的?
  • 请注意,您只构建了 1 个插入多个数据集的查询,因此您不需要 mysqli_multi_query。你有一个sql注入问题。您还应该摆脱 mysqli_store_result 声明。
  • 在 if 语句中,您设置了插入的开始部分 (INSERT INTO...),但在 else 语句中,您没有要执行的真正查询。逻辑是,你需要执行“this”查询,或者“that”查询
  • @MrTechie 不,在else 语句中,一个新集合被添加到现有字符串中。
  • 请提供您的 html 复选框代码 sn-p...

标签: php database checkbox mysqli


【解决方案1】:

@Maximus 和@Eko Junaidi Salam,虽然您可能是对的,但我没有看到任何证据表明前端/表单存在问题。

@jeroen,你完全正确。

  1. CarR 正在处理单个连接查询,因此 mysqli_query 是合适的。
  2. 我建议将用户提供的变量包装在 mysqli_real_escape_string() 中以覆盖查询漏洞。
  3. mysqli_store_result() 用于返回结果集的查询; mysqli_affected_rows() 是用于衡量 INSERT/UPDATE/DELETE 类型查询是否成功的函数。
  4. 最后,纠正 MrTechie 是对的。我认为他没有意识到查询连接。

假设表单提供了必要的值,我将建议一个新的查询构建部分:

$schoolQuery="";
foreach($school as $value){
    if(!$schoolQuery) {
        $schoolQuery="INSERT INTO schoolReunion (graduate_id,schoolName) VALUES ";
    }else{
        $schoolQuery.=",";
    }
    $schoolQuery.="('$graduateID','".mysqli_real_escape_string($dbc,$value)."')";
}
$schoolQuery.=";";

$graduateID 没有被转义,因为我假设它来自安全的地方; $value 被转义,因为它来自用户输入。

现在交付构建的查询。你的代码有语法和逻辑错误,所以试试这个:

if($schoolResult=mysqli_query($dbc,$schoolQuery)){
    $total_rows=mysqli_affected_rows($dbc);
    echo $total_rows," file",($total_rows!=1?"s have":" has")," been added.";
    // if($total_rows<1){echo "Query Logic Error, @ $schoolQuery";}
}else{
    // echo "Query Syntax Error @ $schoolQuery<br>".mysqli_error($dbc);
}

在测试时取消注释错误行,然后重新注释或删除以进行生产。 这应该足以解决您的代码 sn-p 中明显的所有问题。除此之外,还有假设的问题......

由于您提到您正在使用先前的查询来声明 $graduateID,因此我假设您已通过 SELECT 查询获取了该值。请务必检查您是否使用过

mysqli_free_result($graduateResult);    // I assumed this variable name

以避免与后续查询发生任何冲突。这有时会被忽略。

mysqli_multi_query() 最好在处理依赖于先决条件查询的查询时使用。看来您的 $schoolQuery 取决于我称之为“$graduateQuery”的成功。如果你愿意,你可以使用 mysqli_multi_query() 来运行 $graduateQuery 然后 $schoolQuery。为了帮助您实现此功能,我需要查看更多您的代码。如果你想走这条路,最好直接给我发消息或开始一个新帖子(在你自己尝试过之后)。这是你完成了一半的工作:Strict Standards: mysqli_next_result() error with mysqli_multi_query

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2022-07-28
    • 2015-07-27
    相关资源
    最近更新 更多