【问题标题】:PHP - Column count doesn't match value count at row 1PHP - 列数与第 1 行的值计数不匹配
【发布时间】:2013-07-08 17:53:07
【问题描述】:

任何指针将不胜感激 - 谢谢!

我收到“列数与第 1 行的值数不匹配”我猜这是因为我返回的数据数组未包含在 (),(),(), 中。 .?这如何实现?

<?php 

// open the database connection
require('connection.php');

// build the string to populate the database

if (isset($_POST['submit'])) {
 $buffer = "";
 $returnedData = $_POST['data'];

 // escape

 $returnedData = mysqli_real_escape_string($connection, $returnedData);

 foreach ( $returnedData as $data )

 {
    $buffer .= $data['week_date'];
    $buffer .= $data['crew_chief']; 
    $buffer .= $data['monday_crew'];
    $buffer .= $data['tuesday_crew'];
    $buffer .= $data['wednesday_crew'];
    $buffer .= $data['thursday_crew'];
    $buffer .= $data['friday_crew'];
    $buffer .= $data['saturday_crew'];
    $buffer .= $data['sunday_crew'];
    $buffer .= $data['instrument'];
    $buffer .= $data['monday_location'];
    $buffer .= $data['tuesday_location'];
    $buffer .= $data['wednesday_location'];
    $buffer .= $data['thursday_location'];
    $buffer .= $data['friday_location'];
    $buffer .= $data['saturday_location'];
    $buffer .= $data['sunday_location'];
    $buffer .= ", ";
}

 $buffer = rtrim($buffer, ", ");


} // end if


// perform the database insert

$insertQuery = "INSERT INTO log_dates (";
$insertQuery .= " week_date, crew_chief, monday_crew, tuesday_crew, wednesday_crew, thursday_crew, friday_crew, saturday_crew, sunday_crew, instrument, monday_location, tuesday_location, wednesday_location, thursday_location, friday_location, saturday_location, sunday_location";
$insertQuery .= ") VALUES (";
$insertQuery .= "'{$returnedData}'";
$insertQuery .= ")";

$result = mysqli_query($connection, $insertQuery);



// redirect on finish

if ($result) {
    header("Location: http://www..com/");
} else {
    die("Database query failed. " . mysqli_error($connection));
} 

 // close database connection
 mysqli_close($connection);

 ?>

【问题讨论】:

  • 至少 - 回显您的 $insertQuery 以查看它的外观。您将 $returnedData 作为单个变量传递到您的查询中,但您列出了 16 列。你用$buffer 做什么?
  • 你在哪里使用过$buffer
  • 尝试回应您的查询。

标签: php mysql insert


【解决方案1】:

您的代码毫无意义。

$returnedData = $_POST['data'];

一切都很好,花花公子,但你会的

$returnedData = mysqli_real_escape_string($connection, $returnedData);

返回一个STRING。然后你把那个字符串当作一个数组来处理

foreach ( $returnedData as $data )

并从中构建另一个字符串。

然后您尝试 SQL 查询...但完全忽略您构建的这个新字符串

$insertQuery = "INSERT INTO log_dates (";
[[...snip...]]
$insertQuery .= "'{$returnedData}'";
$insertQuery .= ")";

使用这个现在已经损坏的以前的数组,即现在只是一个字符串。

例如你正在构建一个看起来像

的查询
INSERT INTO log_dates (long list of fields)
VALUES (a single value here)

您正在使用 mysqli...没有理由不使用带有占位符的准备好的语句。没有必要自己尝试逃避自己的价值观,尤其是因为无论如何您都在做这部分完全错误的事情。

【讨论】:

  • 如果我回应我的价值观,我会收到:“2013-07-08 - 2013-07-14, Alan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 2013-07-08 - 2013-07-14, 布拉德, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13、14、15,”感谢您的帮助。我在每组周围都缺少( )?我可以添加这个吗?
  • 您将这些值包装在' 中,因此整个字符串会被压缩成一个值。即使您删除了',您仍然会遇到sql 问题,因为2013-07-08 需要单独引用,否则将是一个数学问题。 2013 减 7 减 8 = 1998,Alan 被视为一个字段,而不是名称等......你真的需要阅读准备好的语句和占位符。你的代码现在非常危险。
  • 也许我会像你建议的那样使用准备好的陈述。
猜你喜欢
  • 2023-03-07
  • 2013-08-24
  • 2017-06-21
  • 2011-08-21
  • 2020-01-10
相关资源
最近更新 更多