【问题标题】:php mysql insert query is populating every column with the same valuesphp mysql插入查询正在用相同的值填充每一列
【发布时间】:2015-04-01 06:20:54
【问题描述】:

我正在为一个有很多 mysql 查询的站点开发一个类。类的想法是使它更容易和更统一。该类有效,但在插入查询中,它用数组的最后一个数据条目填充每一列。

这是我的功能:

public function insert($table, $values){

         $sql = "INSERT INTO ".$table." (";
         $x = 0;
         $vals = "";
         foreach($values as $col => $val){
             $sql .= ($x < (count($values) - 1)) ? $col.", " : $col." ";
             $vals .= ($x < (count($values) - 1)) ? "?, " : "? ";
             //$vals .= ($x < (count($values) - 1)) ? $val.", " : $val." ";
             $x++;
         }
         $sql .= ") VALUES (".$vals.")";
         $stmt = $this->db_connection->prepare($sql);
         $x = 0;
         foreach($values as $col => $val){
             //echo 'bindParam('.($x + 1).', '.$val.', PDO::PARAM_INT);';
             $stmt->bindParam(($x + 1), $val, PDO::PARAM_INT);
             $x++;
         }
         //print_r($stmt);
         $stmt->execute();
         print_r($stmt->errorInfo());    
     }

我已经回显了没有错误的sql:

INSERT INTO 帐户(名字、姓氏、电子邮件、地址、帖子、 国家,密码)值(?,?,?,?,?,?,?)

还有参数,同样没有错误:

bindParam(1, john, PDO::PARAM_INT);
bindParam(2, smith, PDO::PARAM_INT);
bindParam(3, john@test.com, PDO::PARAM_INT);
and so on...

这是数据库中的结果:

我似乎找不到哪里出了问题,但显然我在哪里。非常感谢帮助解决此问题。

这就是函数的调用方式:

$this->insert('accounts', array(
                    'first_name' => $f_name,
                    'last_name' => $l_name,
                    'email' => $email,
                    'address' => $address,
                    'post' => $zip,
                    'country' => $country,
                    'password' => $pass
            ));

调用不同的表:

$this->insert('newsletter', array( 'name' => $f_name.' '.$l_name, 'email' => $email )

但是这个有效!! //////// 编辑已解决 /////////////// 问题是 ->bindParam 循环,我把它切换到这个

public function insert($table, $values){

         $sql = "INSERT INTO ".$table." (";
         $x = 0;
         $vals = "";
         $querys = array();
         foreach($values as $col => $val){
             $sql .= ($x < (count($values) - 1)) ? $col.", " : $col." ";
             $vals .= ($x < (count($values) - 1)) ? "?, " : "? ";
             array_push($querys, $val);
             $x++;
         }
         $sql .= ") VALUES (".$vals.")";
         $stmt = $this->db_connection->prepare($sql);
         for($x = 0; $x < count($querys); $x++){
             $stmt->bindParam(($x + 1), $querys[$x], PDO::PARAM_INT);
         }
         //print_r($stmt);
         $stmt->execute();
         print_r($stmt->errorInfo());    
     }

它工作正常,不知道为什么但 foreach 循环导致错误

【问题讨论】:

  • 当你在插入查询之前转储例如 $f_name 时,它​​是否也会给你正确的结果?
  • MySQL 的 utf8 使用 MySQL 的 utf8 字符集用于数据库、表和列,假设它映射到 UTF-8 编码。通过使用 utf8,您可以在数据库中存储您想要的任何符号

标签: php mysql class pdo foreach


【解决方案1】:

我尝试了这个脚本进行测试:

function insert($table, $values){

     $sql = "INSERT INTO ".$table." (";
     $x = 0;
     $vals = "";
     foreach($values as $col => $val){
         $sql .= ($x < (count($values) - 1)) ? $col.", " : $col." ";
         $vals .= ($x < (count($values) - 1)) ? $val.", " : $val." ";
         $x++;
     }
     $sql .= ") VALUES (".$vals.")";
     var_dump($sql);
 }
 insert('accounts', array(
                'first_name' => "f_name",
                'last_name' => "l_name",
                'email' => "email",
                'address' => "address",
                'post' => "zip",
                'country' => "country",
                'password' => "pass"
        ));

这只是创建查询。我最初也得到了你的错误,这是因为单个变量$f_name$l_nameNULL。上面的脚本完美运行,所以你的问题出在你用作方法参数的变量上。

【讨论】:

  • 是的,这是导致问题的参数,我添加了我更改为问题的位。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2021-07-07
  • 2013-03-06
  • 2014-06-21
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
相关资源
最近更新 更多