1

我是 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 错误是 - 'field list' 中的 Unknown column '$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());
}
4

3 回答 3

1

您需要将值括在引号中 - 否则,SQL 会将它们解释为字段名称:

INSERT INTO table (field) VALUES (country)

将查找名为country;的列 然而

INSERT INTO table (field) VALUES ('country')

将添加字符串country

当您的 SQL 失败时,总是值得打印出来以查看正在生成的内容,并直接在数据库中运行以确保它确实有效 - 您也会收到更有帮助的错误消息。

于 2012-07-10T19:51:07.707 回答
1
$valsx = array( '$country',  
                '$stateProvince',
                '$city3',
                '$city3Geocode',
                '$monthlyRental'
         );

使用单引号将输出此处写入的文字字符。用双引号将它们括起来将使它们被变量内容替换。或者由于您没有额外的可打印字符添加到字符串中,请完全删除引号并仅使用变量:

$valsx = array( $country,  
                $stateProvince,
                $city3,
                $city3Geocode,
                $monthlyRental
         );

编辑:

附带说明一下,绝对值得学习使用 PDO 而不是已弃用的 mysql 函数。如果你用谷歌搜索它们,周围有一些很好的教程。

于 2012-07-10T19:52:59.483 回答
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));
于 2012-07-10T19:58:44.977 回答