【问题标题】:Column count doesn't match value count at row 1 - But I have 27 columns and 27 values? PHP MySQL error列数与第 1 行的值数不匹配 - 但我有 27 列和 27 个值? PHP MySQL 错误
【发布时间】:2013-02-19 01:23:06
【问题描述】:

这是我的数组:

$person = array(
    "fullname" => $fn,
    "skin_shade" => $_POST['skin_shade'],
    "acne" => $_POST['acne'],
    "dry_skin" => $_POST['dry_skin'],
    "oily_skin" => $_POST['oily_skin'],
    "wrinkles_aging" => $_POST['wrinkles_aging'],
    "sensative_skin" => $_POST['sensative_skin'],
    "darkspots" => $_POST['darkspots'],
    "hair_type" => $_POST['hair_type'],
    "parabens" => $_POST['parabens'],
    "sulfates" => $_POST['sulfates'],
    "mineral_oil" => $_POST['mineral_oil'],
    "silicones" => $_POST['silicones'],
    "relaxed" => $_POST['relaxed'],
    "colortreated" => $_POST['colortreated'],
    "thinning" => $_POST['thinning'],
    "growth" => $_POST['growth'],
    "braidout" => $_POST['braidout'],
    "roller" => $_POST['roller'],
    "wng" => $_POST['wng'],
    "heat" => $_POST['heat'],
    "wig" => $_POST['wig'],
    "braid" => $_POST['braid'],
    "dreadlocks" => $_POST['dreadlocks'],
    "henna" => $_POST['henna'],
    "hair_color" => $_POST['hair_color'],
    "hair_style" => $_POST['hair_style'],
);

这是我尝试插入它并得到错误的地方:

$columns = implode(", ",array_keys($person));
$escaped_values = array_map('mysql_real_escape_string', array_values($person));
$values = implode(", ", $escaped_values);
$sql = "INSERT INTO people ($columns) VALUES ('$values')";
mysql_query($sql) or die (mysql_error());

我还在列和值上使用了 print_r 以确保它们的大小相同:

print_r($columns); echo"</br></br>";
print_r($values);

这是我得到的输出:

全名,skin_shade,粉刺,干性皮肤,油性皮肤,皱纹_老化, sensative_skin,黑斑,hair_type,对羟基苯甲酸酯,硫酸盐,矿物油, 有机硅,松弛,颜色处理,变薄,生长,编织,滚轮, wng, 热, 假发, 辫子, 辫子, 指甲花, hair_color, hair_style

克里斯·鲁诺,2,不,是,不,是,是,不,直,不,不,不,不, 不,不,不,是,不,不,不,不,不,不,不,不,dark_brown,经典

我还检查了我的 MySQL 表,有 27 列。

【问题讨论】:

    标签: php mysql phpmyadmin key-value-store


    【解决方案1】:
    $sql = "INSERT INTO people ($columns) VALUES ('$values')";
    

    这会将 one 字符串文字放入 VALUES 子句中,这是一个包含逗号分隔值列表的单引号字符串:

    INSERT INTO people (...columns...) VALUES ('Chris Runo, 2, No, Yes, No, Yes, Yes, No, Straight, No, No, No, No, No, No, No, Yes, No, No, No, No, No, No, No, No, dark_brown, classic')
    

    要解决这个问题,您可以编写自己的引用/转义函数并在 array_map() 中使用它:

    function myquote($val)
    {
      return "'" . mysql_real_escape_string($val) . "'";
    }
    
    $escaped_values = array_map('myquote', array_values($person));
    
    $values = implode(", ", $escaped_values);
    $sql = "INSERT INTO people ($columns) VALUES ($values)";
    

    否则,您可以放弃已弃用的 mysql_* 函数,并使用 PDO,这样可以更轻松地编写不受 SQL 注入影响的查询:

    $columns = implode(", ",array_keys($person));
    $params = implode(",", array_fill(0, count($person), "?"));
    
    $sql = "INSERT INTO people ($columns) VALUES ($params)";
    $stmt = $pdo->prepare($sql) or die(print_r($pdo->errorInfo(), true));
    $stmt->execute(array_values($people)) or die(print_r($stmt->errorInfo(), true));
    

    【讨论】:

      【解决方案2】:

      您需要用'' 分隔您的值。所以将你的内爆改为:

      $values = implode("', '", $escaped_values);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        相关资源
        最近更新 更多