Php MySQL INSERT的语法,将$\u POST变量数组放入值中
我不熟悉PHP和MySQL查询构造。昨天我问了一个关于专栏的类似问题,现在需要关于值的帮助。我有一个处理大型表单的处理器。少数字段是必需的,大多数字段是用户可选的。在我的例子中,HTML ID和MySQL列名是相同的。我找到了一些关于使用数组将$\u POST转换为要插入到的字段和值的教程,但我无法让它们正常工作—很多小时之后。我已经退一步使用数组和变量进行了一个非常简单的插入,但我仍然感到困惑。下面几行工作并将5个变量的值插入到包含100多列的数据库中。前4项为字符串,第5项为整数Php MySQL INSERT的语法,将$\u POST变量数组放入值中,php,mysql,Php,Mysql,我不熟悉PHP和MySQL查询构造。昨天我问了一个关于专栏的类似问题,现在需要关于值的帮助。我有一个处理大型表单的处理器。少数字段是必需的,大多数字段是用户可选的。在我的例子中,HTML ID和MySQL列名是相同的。我找到了一些关于使用数组将$\u POST转换为要插入到的字段和值的教程,但我无法让它们正常工作—很多小时之后。我已经退一步使用数组和变量进行了一个非常简单的插入,但我仍然感到困惑。下面几行工作并将5个变量的值插入到包含100多列的数据库中。前4项为字符串,第5项为整数 $cols
$colsx = array('country', 'stateProvince', 'city3', 'city3Geocode', 'monthlyRental');
$col_string = implode(',', $colsx);
$query = "INSERT INTO `$table` ($col_string) VALUES ( '$country', '$stateProvince', '$city3', '$city3Geocode', '$monthlyRental')";
按照这个想法,我使用预处理的变量来构造一个数组,然后将其内爆来创建一个字符串
//these variables are "pre-processed", e.g., $country=$_POST['country'] and validated, but not yet mysql_real_escape_string
$valsx = array( '$country', '$stateProvince', '$city3', '$city3Geocode', '$monthlyRental' );
$val_string = implode(",", $valsx);
$query = "INSERT INTO `$table` ($col_string) VALUES ( $val_string )";
它不起作用。我尝试过改变很多事情,但是没有结果。我在这段代码中遇到的MySQL错误是-“field list”中的未知列“$country”,它指的是$valsx数组中的“$country”,但我不知道这是一个字段列表,也不知道如何解决这个问题 请具体提出建议。我对MySQL和PHP非常陌生 好的,根据伊瑟尼的建议,这里是当前的代码。它不会执行。我需要他的代码方面的帮助,以及在哪里和如何放置错误消息方面的帮助
$colsx = $fields = $valsx = $values = array();
$colsx = array('country', 'stateProvince', 'city3', 'city3Geocode', 'monthlyRental');
$col_string = implode(',', $colsx);
$valsx = array( "$country", "$stateProvince", "$city3", "$city3Geocode", "$monthlyRental" );
$val_string = implode(",", $valsx);
foreach($colsx as $col) {
$fields[] = $col;
if ( is_numeric($_POST[$col]) ) {
$values[] = mysql_real_escape_string($_POST[$col]);
}else{
$values[] = "'".mysql_real_escape_string($_POST[$col])."'";
}
}
$fields_sql = implode(',', $fields);
$values_sql = implode(',', $values);
$query = "INSERT INTO `$table` ($fields_sql) VALUES ($values_sql);"
if (!mysql_query($query,$conn))
{
die('<li class=error>an error occurred posting to the database. </li>'. mysql_error());
}
$colsx=$fields=$valsx=$values=array();
$colsx=数组('country'、'stateProvince'、'city3'、'city3Geocode'、'MonthlyEntal');
$col_string=内爆(',',$colsx);
$VALx=数组(“$country”、“$stateProvince”、“$city3”、“$city3Geocode”、“$monthlyRental”);
$val_string=内爆(“,”,$valsx);
foreach($colsx作为$col){
$fields[]=$col;
if(是数字($\u POST[$col])){
$values[]=mysql\u real\u escape\u字符串($\u POST[$col]);
}否则{
$values[]=“'”。mysql\u real\u escape\u字符串($\u POST[$col])。“'”;
}
}
$fields_sql=内爆(',',$fields);
$values\u sql=内爆(',',$values);
$query=“插入到`$table`($fields\u sql)值($VALUES\u sql);”
if(!mysql_query($query,$conn))
{
die('向数据库发布时出错。 '.mysql_error());
}
您需要将值用引号括起来-否则,SQL将把它们解释为字段名:
INSERT INTO table (field) VALUES (country)
将查找名为国家的列
;鉴于
INSERT INTO table (field) VALUES ('country')
将添加字符串country
当您的SQL失败时,总是值得打印出来看看生成了什么,并直接在数据库中运行,以确保它实际工作——您也会收到更有用的错误消息
$valsx = array( '$country',
'$stateProvince',
'$city3',
'$city3Geocode',
'$monthlyRental'
);
使用单引号将输出此处写入的文字字符。用双引号将它们括起来,它们将被内容变量替换。或者,由于没有额外的可打印字符添加到字符串中,请完全删除引号并仅使用变量:
$valsx = array( $country,
$stateProvince,
$city3,
$city3Geocode,
$monthlyRental
);
编辑:
另一方面,使用PDO而不是不推荐的mysql函数绝对值得学习。如果你在谷歌上搜索,这里有一些不错的教程。我想这样做:
$colsx = array('country', 'stateProvince', 'city3', 'city3Geocode', 'monthlyRental');
// List of optional fields
$colsy = array('otherfield', 'other2', ...);
// Building the query
$fields = array();
$values = array();
// Mandatory fields
foreach($colsx as $col)
{
if (!isset($_POST[$col]))
die("MISSING field $col";
$fields[] = $col;
if (is_numeric($_POST[$col]))
$values[] = mysql_real_escape_string($_POST[$col]);
else
$values[] = "'".mysql_real_escape_string($_POST[$col])."'";
}
// Optional fields
foreach($colsy as $col)
{
//if (!isset($_POST[$col]))
// die("MISSING field $col";
$fields[] = $col;
if (is_numeric($_POST[$col]))
$values[] = mysql_real_escape_string($_POST[$col]);
else
$values[] = "'".mysql_real_escape_string($_POST[$col])."'";
}
$fields_sql = implode(',', $fields);
$values_sql = implode(',', $values);
$query = "INSERT INTO `$table` ($fields_sql) VALUES ($values_sql);"
如果你已经有了验证过的字段,你可以这样做(但是我认为有人建议使用PDO代替MySQL函数,以后再考虑这个问题)。
使用PDO也是一样的:$data = array(
// FIELD VALUE ("$country" and $country are the same thing)
'country' => $country,
'stateProvince' => $stateProvince,
'city3' => $city3,
...
);
// Process $data to get SQL fields (we could use array_fill)
$values = array();
foreach($data as $field => $value)
$values[] = '?'; // Placeholder, without quotes
$fields_pdo = implode(',', array_keys($data));
$values_pdo = implode(',', $data);
// This is now INSERT INTO mytable (city,rent,...) VALUES (?,?,?,...);
$query = "INSERT INTO $table ($fields_sql) VALUES ($values_sql);";
$q = $conn->prepare($query);
$q->execute(array_values($data));
请尝试回显您的SQL语句,以便查看您实际生成的内容。请停止使用旧的和已折旧的
mysql\uuz
语句。请考虑使用<代码> PDO < /代码> <代码> MySqLI:/COD>。字符串是一种变量,尝试删除单引号和使用纯变量,如您所示,并且我尝试用双引号替换单引号。在这两个测试中,我都收到一条错误消息-语法错误在。“字段列表”中的未知列“$country”。。。这表明你在生成专栏的代码中使用了更多的变量名,大卫,我不明白你的意思,也不知道如何处理你的评论。你能说得具体一点吗?从你最初的错误来看,很明显$country是字面意思。i、 e.您在SQL语句中输入的实际值是“$country”,而不是它的字符串表示形式。进行var_转储($valsx)并亲自查看。我认为问题是当你将阵列内爆时。也许一个简单的讨论会更好。我今晚要做这个-我有个约会。PHP已经测试了必填字段,并在插入之前向用户提供反馈。所以我认为这只是第二组要尝试的代码。@Iserni我尝试了第二组代码。它不会执行。我不知道应该把错误信息放在哪里才能知道发生了什么。我会尝试用当前代码编辑我上面的帖子,这样你就可以看到了。我在代码中看到的好处是对数字和字符串的不同处理。我没有在教程中看到这一点,非常感谢您的澄清。我的代码重新提取了_POST中的值,您似乎使用了$valsx。但在$valsx中,您不会在值周围添加引号,因此会得到无效的SQL。将编辑答案添加不同的方法。伊瑟尼,你是冠军。它起作用了。感谢您的明确和具体,以及您的耐心帮助。我从您那里学到了在INSERT中使用字符串和数字,以及使用关联数组。我很感激你建议将PDO作为下一步,但“按现状”与我合作。学习PDO/mysqli需要很多时间,但你让我在我现在的阶段就开始了。非常感谢。
$data = array(
// FIELD VALUE ("$country" and $country are the same thing)
'country' => $country,
'stateProvince' => $stateProvince,
'city3' => $city3,
...
);
// Process $data to get SQL fields (we could use array_fill)
$values = array();
foreach($data as $field => $value)
$values[] = '?'; // Placeholder, without quotes
$fields_pdo = implode(',', array_keys($data));
$values_pdo = implode(',', $data);
// This is now INSERT INTO mytable (city,rent,...) VALUES (?,?,?,...);
$query = "INSERT INTO $table ($fields_sql) VALUES ($values_sql);";
$q = $conn->prepare($query);
$q->execute(array_values($data));