【问题标题】:Why is my data not submitted to MySQL database?为什么我的数据没有提交到 MySQL 数据库?
【发布时间】:2011-08-04 11:13:09
【问题描述】:

我有一个 PHP 引擎页面,它处理在具有可变行的表单上输入的数据。 PHP 生成一封电子邮件,还应该将数据输入到已经创建的 MySQL 表中。电子邮件工作正常,但由于某种原因,我的 MySQL 数据库中没有输入任何数据。我确信数据库和表的所有设置都是正确的。我也没有看到任何错误消息。我的代码包含以下内容:

表单的html:

<form method="post" name="booking" action="bookingengine.php">
    <fieldset>
        <h2>Waged/Organisation Rate</h2>
       <p>
            <input type="text" name="name[]">
            <input type="text" name="email[]">
            <input type="text" name="organisation[]">
            <input type="text" name="position[]">
        </p>
        <p><span class="add">Add person</span></p>
    </fieldset>

    <fieldset>
        <h2>Unwaged Rate</h2>
        <p>
            <input type="text" name="name2[]">
            <input type="text" name="email2[]">
        </p>
        <p><span class="add">Add person</span></p>
    </fieldset>

    <p><input type="submit" name="submit" id="submit" value="Submit and proceed to payment page" class="submit-button" /></p>

</form>

connection.php:

<?php

$hostname = "localhost";
$database = "****";
$username = "****";
$password = "****";
$connection = mysql_connect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);

?>

bookingengine.php:

<? include 'connection.php'; ?>

<?php

$emailFrom = "****";
$emailTo = "****";
$subject = "Booking for Soteria Conference";

$body = "The following people have booked for the Soteria Conference in Derby:" . "\n\n" . "Waged/Organisation Rate:" . "\n\n";
$row_count = count($_POST['name']);
$row_count2 = count($_POST['name2']);

 $values = array();

 for($i = 0; $i < $row_count; $i++) {
     // variable sanitation...
     $name = trim(stripslashes($_POST['name'][$i]));
     $email = trim(stripslashes($_POST['email'][$i]));
     $organisation = trim(stripslashes($_POST['organisation'][$i]));
     $position = trim(stripslashes($_POST['position'][$i]));

     // this assumes name, email, and telephone are required & present in each element
     // otherwise you will have spurious line breaks. 
     $body .= "Name: " . $name . "    Email: " . $email . "  Organisation: " . $organisation . "   Position: " . $position . "\n\n";

     //prepare the values for MySQL
     $values[] = '(' . $name . ',' . $email . ',' . $organisation . ',' . $position . ')';
}

mysql_select_db($database, $connection);

$query = "INSERT INTO conference (Name, Email, Organisation, Position) VALUES " . implode(',', $values);

 $values = array();

 $body .= "Unwaged Rate:" . "\n\n";

 for($i = 0; $i < $row_count; $i++) {
     // variable sanitation...
     $name = trim(stripslashes($_POST['name'][$i]));
     $email = trim(stripslashes($_POST['email'][$i]));

     // this assumes name, email, and telephone are required & present in each element
     // otherwise you will have spurious line breaks. 
     $body .= "Name: " . $name . "    Email: " . $email . "\n\n";

     //prepare the values for MySQL
     $values[] = '(' . $name . ',' . $email . ')';
}
$query = "INSERT INTO conference (Name, Email) VALUES " . implode(',', $values);

// send email 
$success = mail($emailTo, $subject, $body, "From: <$emailFrom>");

// redirect to success page 
if ($success){
  print "<meta http-equiv=\"refresh\" content=\"0;URL=/conference/payment.html\">";
}
else{
  print "<meta http-equiv=\"refresh\" content=\"0;URL=error.htm\">";
}
?>

谁能发现为什么数据没有被发送到 MySQL 数据库?

谢谢,

尼克

当前代码:

for($i = 0; $i < $row_count; $i++) {
     // variable sanitation...
     $name = trim(stripslashes($_POST['name'][$i]));
     $email = trim(stripslashes($_POST['email'][$i]));
     $organisation = trim(stripslashes($_POST['organisation'][$i]));
     $position = trim(stripslashes($_POST['position'][$i]));

     // this assumes name, email, and telephone are required & present in each element
     // otherwise you will have spurious line breaks. 
     $body .= "Name: " . $name . "    Email: " . $email . "  Organisation: " . $organisation . "   Position: " . $position . "\n\n";

     //prepare the values for MySQL
     $values = "'" . $name . "','" . $email . "','" . $organisation . "','" . $position . "'";
}

mysql_select_db($database, $connection);

$query1 = "INSERT INTO conference (Name, Email, Organisation, Position) VALUES " . $values;

$result1 = mysql_query($query1);
if (!$result1) {
  die('Invalid query: ' . mysql_error());
}

【问题讨论】:

  • 您是否正在获取 $_POST['name'][$i] 的值
  • 您实际在哪里运行查询?我没看到。
  • 另外,您不要使用stripslashes() 来清理输入。当您从数据库中提取数据时使用它。请改用mysq_real_escape_string()
  • 您的问题是:“无法连接到 MySQL 数据库”。您是否在任何地方收到此错误?或者你的问题应该是:“为什么数据没有插入到数据库中?”
  • 谢谢。是的,我实际上并没有运行查询。现在我正在运行它们,我收到错误:“无效查询:'字段列表'中的未知列 'asdasdas'”,其中 'asdasdas' 是我在名称字段中输入的内容。

标签: php mysql forms connect


【解决方案1】:

我猜你在设置插入语句后没有执行查询。

【讨论】:

    【解决方案2】:

    缺少mysql_query($query); 或其他执行查询的函数。您正在使用 $query = ... 构建查询,但随后您不使用此变量。

    您可以添加如下内容:

    $result = mysql_query($query);
    if (!$result) {
      die('Invalid query: ' . mysql_error());
    }
    

    更多详情见:http://www.php.net/manual/en/function.mysql-query.php

    此外,查询缺少一些撇号的值:

    您的代码:

     $values[] = '(' . $name . ',' . $email . ',' . $organisation . ',' . $position . ')';
    

    应该是这样的:

     $values[] = '(\'' . $name . '\',\'' . $email . '\',\'' . $organisation . '\',\'' . $position . '\')';
    

     $values[] = "('" . $name . "','" . $email . "','" . $organisation . "','" . $position . "')";
    

    否则这些值将被解释为字段名称。

    【讨论】:

    • 谢谢。我添加了这个,现在得到错误:“无效查询:'字段列表'中的未知列'asdasdas'”,其中'asdasdas'是我在名称字段中输入的内容。
    • 不客气。另外我想说,这段代码可能需要进一步改进。特别是不需要使用仅使用一个值的数组+内爆。一个简单的字符串就可以做到这一点。
    • 我认为我确实需要一个数组,因为我正在处理具有可变行数的表单。
    • 您正在将 POST 数组转换为 // variable sanitation 下的单独变量...
    • 好的,但是你能告诉我为什么我只会用上面发布的当前代码将表单每个部分的最后一行提交给 MySQL 吗?
    【解决方案3】:

    以您的第一个查询值为例...

    $query = "INSERT INTO conference (Name, Email, Organisation, Position) VALUES (" . $values . ")";
    

    这实际上并没有执行查询,而只是定义它。你必须通过mysql_query() 像这样传递它来执行它的额外步骤......

    mysql_query($query);
    

    不用说,您可能应该考虑在将数据插入数据库之前对其进行消毒。祝你好运!

    编辑:更改此行...

    $values[] = '(' . $name . ',' . $email . ',' . $organisation . ',' . $position . ')';
    

    到这个。如您所见,您需要为各个值加上引号,并且在这种情况下不需要数组。只需使用一个字符串。您还可以从查询字符串中删除 implode() 并仅引用该变量。

    $values = "('" . $name . "','" . $email . "','" . $organisation . "','" . $position . "')";
    

    【讨论】:

    • 谢谢。我添加了这个,现在得到错误:“无效查询:'字段列表'中的未知列'asdasdas'”,其中'asdasdas'是我在名称字段中输入的内容。
    • 谢谢。我尝试更改为字符串,现在我在 implode 函数上收到错误,您还说我应该删除它。我将如何“仅引用变量”?抱歉有点傻!
    • 只需将您的查询分配字符串中的implode(',', $values) 更改为$values
    • 谢谢。我现在收到错误消息:“无效查询:您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,了解在 ''1'、'2'、'3' 附近使用的正确语法, '4'' 在第 1 行" 。我在原始问题的末尾发布了当前代码的相关部分。
    • 错误消息中的 ''1','2','3','4'' 将对应于我用于表单的虚拟值。
    猜你喜欢
    • 2015-02-05
    • 2021-05-24
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多