【问题标题】:array values are inserted as 0 in the table数组值在表中插入为 0
【发布时间】:2014-10-14 18:47:20
【问题描述】:

我正在尝试在数据库中插入用户答案(到 php 表单)。 答案被插入到表“Answer”中,该表有 4 列:(Id, userId, qId, answer) 其中 Id 是唯一 id,qId 是问题 Id(问题存储在表“question”中)。

问题: 这是我尝试将数据插入数据库的代码(insertPage1.php):

<?php

try{
  $conn = new PDO('mysql:dbname=Application;host=localhost;charset=utf8mb4', 'user', 'xxxx');

  $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$i = 0;
foreach($_SESSION['post'] as $key => $value) {

         $stmt = $conn->prepare('INSERT INTO Answer (userId, qId, answer) VALUES (userId = :username, qId = :qId, answer = :answer)');
         $stmt -> execute(array(':username' => $_SESSION['SESS_USERNAME'], ':qId' => $key, ':answer' => $value));

    echo "$i\n";
        echo "$key\n";
    echo "$value\n";
    $i++;

      }
}
   catch(PDOException $e) {
        echo 'Exception -> ';
        var_dump($e->getMessage());
       }

 ?>

这是 page2.php 中的代码,我在其中检查 page1 中发布的答案:

foreach ($_POST as $key => $value) {
   if (is_array($_POST[$key])){
           $_SESSION['post'][$key] = implode("\n", $_POST[$key]);     
             }
           else{
                $_SESSION['post'][$key] = $value;
            }
       }

extract($_SESSION['post']); // Function to extract array.*/
include('insertPage1.php');
?>
<html>
//html for the second page...
</html>

结果如下:|

但关键是,正如在第一个代码“insertPage1.php”中看到的那样,我添加了 3 行(回显)来打印 $i、$key 和 $value 的值......虽然,我看到了$value 在日志中正确显示(即显示 q1、q2、...),我不知道为什么它们在表中显示为“0”?!!!

任何想法都将受到高度赞赏,

【问题讨论】:

  • 你为什么要做`VALUES (userId = :username, qId = :qId, answer = :answer)` 而不仅仅是`VALUES (:username, :qId, :answer)`?跨度>

标签: php arrays pdo insert


【解决方案1】:
  1. 修复明显的 sql 语法错误。
  2. userId 是你给你的专栏起的名字不要使用用户名你只会混淆你自己
  3. 我建议你在使用它之前先调用它$_SESSION['userId']并使用session_start()
  4. 会话无需直接使用$_POST
  5. 如果键是数组,不要内爆,循环遍历它

try{
$conn = new PDO('mysql:dbname=Application;host=localhost;charset=utf8mb4', 'user', 'xxxx');

$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'INSERT INTO Answer (userId, qId, answer) VALUES (:userId, :qId, :answer)';
$stmt = $conn->prepare($sql);

foreach ($_POST as $key => $value) {
    if (!is_array($_POST[$key])){
            $stmt->execute(array(':userId' => $_SESSION['userId'], ':qId' => $key, ':answer' => $value));
    }
    else{
        foreach ($_POST[$key] as $sub_key => $sub_value) { 
            $stmt->execute(array(':userId' => $_SESSION['userId'], ':qId' => $sub_key, ':answer' => $sub_value));
        }
    }
}

}
catch(PDOException $e) {
    echo 'Exception -> ';
    var_dump($e->getMessage());
}

一些调试技巧:

  • 0 相当于 int 的 null
  • 使用print_r($_POST)print_r($_SESSION)
  • error_log 很有帮助,用它来记录你正在插入的变量

【讨论】:

  • 非常感谢您的完整解释和有用的提示 :) 只是它有一个问题是它还插入“提交”作为 qId 和“保存并继续”作为答案!你知道我怎样才能摆脱这个吗?!
【解决方案2】:

纠正这个说法

         $stmt = $conn->prepare('INSERT INTO Answer (userId, qId, answer) VALUES (userId = :username, qId = :qId, answer = :answer)');

         $stmt = $conn->prepare('INSERT INTO Answer (userId, qId, answer) VALUES (:username, :qId, :answer)');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多