【问题标题】:MySQL INSERT is only inserted the first row of foreach loopMySQL INSERT 只插入 foreach 循环的第一行
【发布时间】:2015-05-10 01:11:00
【问题描述】:

我在 PHP 中的 foreach 循环有点麻烦。我正在尝试从 html 表单中插入一堆值。表单中表格的工作方式是用户可以根据需要添加一行。无论出于何种原因,foreach 循环仅插入表的第一行,几个小时后我似乎找不到解决方案。

下面是foreach循环:

$sql = "INSERT INTO map_input (user_id, point_desc, lat, lon) VALUES ";

//inserting into the map_input table
foreach($_GET['input_Lat'] as $i => $Lat)
{
	//get values from form
	$in_Desc = mysql_real_escape_string($_GET['input_Desc'][$i]);
	$Lat = mysql_real_escape_string($Lat);
	$Lon = mysql_real_escape_string($_GET['input_Lon'][$i]);
	
	$sql = $sql."('$user_id', '$in_Desc', '$Lat', '$Lon]'),";
	
}

表单表中每个文本框的值是“input_Desc[]”、“input_Lat[]”、“input_Lon[]”。

任何帮助将不胜感激!

编辑:“Desc”已更改为“in_Desc”,这样它就不会与保留字发生冲突。连接的 sql 语句末尾的分号已更改为逗号。结果还是一样。

回显 sql 语句,这是结果INSERT INTO map_input (user_id, point_desc, lat, lon) VALUES ('4', 'Start', '53.066363', ' -6.293127]'),

**编辑:**为表格添加了下面的 HTML 并添加了额外的行。 表格/表格

<form action="mapInput.php" method="get">
      <table id="gpsPoints">
        <tr>
          <th>Description</th>
          <th>Latitude</th>
          <th>Longitude</th>
        </tr>
        <tr>
          <td> <input type="text" name="input_Desc[]"> </td>
          <td><input type="text" name="input_Lat[]" ></td>
          <td><input type="text" name="input_Lon[]"></td>
        </tr>
      </table>
      <br>
      <br>
      <input type="submit" value="Save Route" >
      </form>
      <br>
      <br>
      <button onClick="addRow()" >Add new point </button>

添加行功能:

function addRow()
{
	var table = document.getElementById("gpsPoints");
	var row = table.insertRow(2);
	var cell1 = row.insertCell(0);
	var cell2 = row.insertCell(1);
	var cell3 = row.insertCell(2);
	
	//adding text boxes to each cell
	var element1 = document.createElement("input");
	element1.type = "textbox";
	element1.name = "input_Desc[]";
	cell1.appendChild(element1);
	
	var element2 = document.createElement("input");
	element2.type = "textbox";
	element2.name = "input_Lat[]";
	cell2.appendChild(element2);
	
	var element3 = document.createElement("input");
	element2.type = "textbox";
	element2.name = "input_Lon[]";
	cell3.appendChild(element3);
	
}//end function addRow()
</script>

编辑这些值肯定会像在 url 栏中一样被传入,但是它们不会进入 foreach 循环并被插入。

【问题讨论】:

  • 老兄,先用 print_r() 调试你的 GET 数据,看看你得到了什么......
  • Desc 是保留字,用反引号 `desc` 括起来,但在这种情况下不应该添加任何行
  • 同样在那个循环的结尾,问题是你会有一个语句 INSERT INTO blah VALUES 1,2,3,4,所以最后你会有一个额外的逗号。使用一些一种子字符串函数来删除它
  • @Mihai 我在循环之外有一个子字符串函数。仍然只插入第一行
  • 我们可以看到 $sql 回显了吗?

标签: php mysql foreach


【解决方案1】:

您正在关闭您对在线 sql 连接的请求:

$sql = $sql."('$user_id', '$Desc', '$Lat', '$Lon]');";

";" 替换为 ","

并在循环之后添加:

$sql = substr($sql, 0, -1) . ";";

【讨论】:

  • 我之前在语句的末尾有“,”,但它仍然没有添加超过第一行。不过谢谢
  • 最后不是逗号,你是在串联中......请求必须看起来像这样:插入表(f1,f2)值(1,2),(1,3) ,... (1, n);因此,您必须在循环中添加逗号,但以“;”结尾您可以使用: $sql = substr($sql,0, -1).";";
  • 我已经在循环之后有了 substr。但是,我确实在其末尾添加了“。”;”; 非常感谢您。但问题仍然存在。只有第一行仍在添加。
  • 你能从你的表单处理器中粘贴一个 print_r($_GET) 你必须通过 POST(GET 有大小限制)
  • 打印的声明在上面。将方法更改为 POST,但仍然无法正常工作。
【解决方案2】:

你的查询字符串最终看起来像

INSERT INTO map_input (user_id, desc, lat, lon) VALUES ('user_id', 'desc1', 'lat1', 'lon1'); ('user_id', 'desc2', 'lat2', 'lon2');

替换行尾的;

$sql = $sql."('$user_id', '$Desc', '$Lat', '$Lon]');"; to read $sql = $sql."('$user_id', '$Desc', '$Lat', '$Lon]'),";

也变了

$sql = "INSERT INTO map_input (user_id, desc, lat, lon) VALUES ";

成为

$sql = "INSERT INTO map_input (user_id, `desc`, lat, lon) VALUES ";

这是因为 desc 是 mysql 中的保留字。

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 2014-04-04
    • 2014-01-19
    • 1970-01-01
    • 2013-10-15
    • 2014-07-20
    • 2012-06-19
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多