我是PHP和MySQL查询构建的新手。昨天我问了一个关于列的类似问题,现在需要VALUES的帮助。我有一个大型的处理器。需要一些字段,大多数字段是用户可选的。在我的例子中,HTML ID和MySQL列名称是相同的。我找到了关于使用数组将$ _POST转换为INSERT INTO的字段和值的教程,但是我不能让它们工作 - 几个小时之后。我已经退回到使用数组和变量进行非常简单的INSERT,但我仍然难过。以下行工作并将5个变量的值插入到包含100多列的数据库中。前4项是字符串,第5项,monthlyRental是整数。
$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错误是 - '字段列表'中的未知列'$ country'它是指$ valsx数组中的'$ country',但我看不出这是一个字段列表,或者如何解决问题。
请具体提出建议。我是MySQL和PHP的新手。
好的,根据Iserni的建议,这是当前的代码。它不会执行。我需要帮助他的代码,我需要帮助处理错误消息的位置和方式。
$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());
}
答案 0 :(得分:1)
您需要将值包装在引号中 - 否则,SQL会将它们解释为字段名称:
INSERT INTO table (field) VALUES (country)
将查找名为country
的列;而
INSERT INTO table (field) VALUES ('country')
将添加字符串country
当你的SQL失败时,总是值得打印出来看看正在生成什么,并在数据库中直接运行以确保它确实有效 - 你得到的错误消息也更有帮助。
答案 1 :(得分:1)
$valsx = array( '$country',
'$stateProvince',
'$city3',
'$city3Geocode',
'$monthlyRental'
);
使用单引号将输出此处写入的文字字符。用双引号括起它们将使它们被变量内容替换。或者,由于您没有要添加到字符串的额外可打印字符,请完全删除引号并仅使用变量:
$valsx = array( $country,
$stateProvince,
$city3,
$city3Geocode,
$monthlyRental
);
修改强>
另一方面,绝对值得学习使用PDO而不是弃用的mysql函数。如果你谷歌为他们提供一些很好的教程。
答案 2 :(得分:1)
我会这样做:
$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_函数会更好;考虑稍后再做)。
$data = array(
// FIELD VALUE ("$country" and $country are the same thing)
'country' => $country,
'stateProvince' => $stateProvince,
'city3' => $city3,
...
);
// If you need to add a field conditionally, you do it like this:
// if (isset($_POST['newfield']))
// $data['newfield'] = $_POST['newfield'];
// or also, maybe:
//
// if (isset($_POST['newfield']) && !empty($_POST['newfield']))
// $data['newfield'] = $_POST['newfield'];
// Process the values in $data to get SQL fields (PDO does this by itself)
$values = array();
foreach($data as $field => $value)
{
if (is_numeric($value))
$values[] = $value;
else
$values[] = "'".mysql_real_escape_string($value)."'";
}
// Now we have all we need. The "fields" are $data's keys.
$fields_sql = implode(',', array_keys($data));
$values_sql = implode(',', $values);
$query = "INSERT INTO `$table` ($fields_sql) VALUES ($values_sql);";
使用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));