【问题标题】:php insert multiple values into separate rows in mysql tablephp将多个值插入mysql表中的单独行
【发布时间】:2014-12-02 06:53:18
【问题描述】:

我有一个带有各种类型输入字段(复选框、下拉列表、单选、自动完成等)的 PHP 表单。我想做的是让用户输入(可能不止一个值,例如例如,问题是:你最喜欢哪部电影?他可能会写超过 1 部电影)并将这些值存储在 Mysql 表中的单独行中。 这是我数据库中的表:

答案: Id、userId、questionId、答案

成员:用户 ID、姓名、姓氏等

问题:questionId, questionText

我能做的是这样的:(注意:在这种情况下,设计会有所不同,这里我为每个问题设置了一个单独的字段)

$stmt = $conn->prepare('UPDATE test SET q1 = :q1, q2 = :q2, q3 = :q3, q4 = :q4, q5 = :q5, q6     = :q6, q7 = :q7 WHERE username = :username');
$stmt->execute(array(':q1' => $q1,':q2' => $q2, ':q3' => $q3, ':q4' => $q4, ':q5' => $q5, ':q    6' => $q6, ':q7' => $q7, ':username' => $_SESSION['SESS_USERNAME']));

我对这种方法的问题是多个值的答案被插入到同一行中,并用逗号分隔(例如,如果用户写了“Tom Cruise”和“Brad Pitt”,它会将这两个名称存储在同一行中)

我想我必须用这样的东西替换它:

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

但是这里我不知道如何定义qId? (它如何识别每个答案与哪个问题相关)

编辑:

在下面的代码中,我可以从数据库中获取问题并将其存储在数组中,但我仍然不确定如何完成此代码.. 我应该在循环内编写插入语句(从数据库获取问题的循环,所以对于每个问题,它都会插入 qId 和用户插入的答案......我是对的吗??)

$arr = array(); 
$sql="select qId from question"; 
$result = mysql_query($sql) or die(mysql_error());
while( $row = mysql_fetch_assoc( $result ) ) {
   arr[] = $row[ 'qId' ]; 
} 

有人可以帮我了解如何将这些值插入多行吗?

非常感谢,

【问题讨论】:

  • INSERT with WHERE don't mix, your first query shoudnt work
  • 我同意 Mihai,您唯一能做的就是尝试帮助用户输入正确的数据,通过某种方式(如电子邮件、电话号码)和/或您标题的方式验证它字段,如“名字”“姓氏”等。我不会改变我的设计来解释用户输入错误数据的原因,因为他们总会在某个时候这样做。稍后您会很高兴所有字段都是分开的,因为使用这些数据会更容易。
  • 真的,数据库设计必须反映您计划如何使用数据,在同一个领域同时拥有“汤姆克鲁斯”和“布拉德皮特”可能会非常好,这一切都取决于什么你想用它做到底。因为,您可以像这样搜索它们 Like %tom Cruise% 并找到它,即使有另一个也很好。
  • @ArtisiticPhoenix:感谢您的精彩信息!实际上,我需要知道哪个答案是由哪个用户编写的(因为我需要它用于我的基于用户的研究项目,并且稍后需要它用于推荐目的..(我的研究是关于推荐系统算法)
  • @mihai:你是对的,我已经收到了错误,谢谢你提到它:)

标签: php mysql forms pdo


【解决方案1】:

问题的 id 可以是后端的数组。您可以遍历数组并在循环中插入问题。

另一种方法是使用variable variables在for循环中组合变量名。

Array 对我来说似乎是更简洁的代码。 :)

【讨论】:

  • 感谢Aret的回答,我的问题是我不知道如何定义这个数组..我应该这样写s.th吗? $arr = 数组(); $sql="从答案中选择 qId"; $result = mysql_query($sql) 或死(mysql_error()); while( $row = mysql_fetch_assoc( $result ) ) { arr[] = $row[ 'qId' ]; }
  • 我认为它从表“问题”中获取“qId”行并将它们插入数组中......如果是,那么我该如何迭代这个数组? :|
  • 从这些创建表单后,您将遇到一系列问题。在创建表单时使用方括号,按下提交后就会发生奇迹。谷歌这些例子:davidwalsh.name/checkbox-form-input-arrays
【解决方案2】:

如果您已经得到由 qId 存储在 $_POST 中的答案,并且您在输入名称中使用 [],正如 Aret 建议的那样,您可以执行以下操作:

// creates an object, $stmt, which will do an insert whenever $stmt->execute()
// is called
$stmt = $conn->prepare('INSERT INTO Answer (qId, answer) VALUES (:qId, :answer)');

$sql="select qId from Answer"; 
$result = mysql_query($sql) or die(mysql_error());

// loop over all question ids
while( $row = mysql_fetch_assoc( $result ) ) {

  $qId = $row['qId'];

  // loop over all the answers for one question
  foreach ($_POST[$qId] as $answer) {

    // this runs the sql from the first line with :qId set to $qId, 
    // and :answer set to $answer
    $stmt->execute(array(':qId' => $qId, ':answer' => $answer));

  }

} 

【讨论】:

  • 请注意,这假设所有答案都在数组中,即使该问题只有一个答案。
  • 抱歉,这最后一行执行了什么?!不应该是在更新或将答案插入表格之前的一行吗?!!!
  • 我已经添加了cmets来解释最后一行从第一行开始运行sql。
猜你喜欢
  • 2016-09-25
  • 2016-09-18
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2018-07-03
  • 2016-09-25
  • 2020-09-02
  • 2013-10-12
相关资源
最近更新 更多