Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL INSERT的语法,将$\u POST变量数组放入值中_Php_Mysql - Fatal编程技术网

Php MySQL INSERT的语法,将$\u POST变量数组放入值中

Php MySQL INSERT的语法,将$\u POST变量数组放入值中,php,mysql,Php,Mysql,我不熟悉PHP和MySQL查询构造。昨天我问了一个关于专栏的类似问题,现在需要关于值的帮助。我有一个处理大型表单的处理器。少数字段是必需的,大多数字段是用户可选的。在我的例子中,HTML ID和MySQL列名是相同的。我找到了一些关于使用数组将$\u POST转换为要插入到的字段和值的教程,但我无法让它们正常工作—很多小时之后。我已经退一步使用数组和变量进行了一个非常简单的插入,但我仍然感到困惑。下面几行工作并将5个变量的值插入到包含100多列的数据库中。前4项为字符串,第5项为整数 $cols

我不熟悉PHP和MySQL查询构造。昨天我问了一个关于专栏的类似问题,现在需要关于值的帮助。我有一个处理大型表单的处理器。少数字段是必需的,大多数字段是用户可选的。在我的例子中,HTML ID和MySQL列名是相同的。我找到了一些关于使用数组将$\u POST转换为要插入到的字段和值的教程,但我无法让它们正常工作—很多小时之后。我已经退一步使用数组和变量进行了一个非常简单的插入,但我仍然感到困惑。下面几行工作并将5个变量的值插入到包含100多列的数据库中。前4项为字符串,第5项为整数

$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));