mysql - PHP PDO Insert class method not working -


i typed class it's extended pdo class , using on project. in insert method error.

on follow codes insert table:

public function insert($table, $data) {      ksort($data);     $field_names = implode(', ',array_keys($data));     $field_values = ':'.implode(', :',array_keys($data));     $sth = $this->prepare("$table ($field_names) values($field_values)");      foreach ($data $key => $value) {          $sth->bindvalue(":$key",$value);     }     $this->_numrows = $sth->rowcount();      if($this->_numrows > 0)         return 1;     else         return 0; } 

and using on project this:

     return $this->db->insert("insert kategoriler(tr_adi,en_adi,sira,isheader,parentid,url) values(:tr_adi,:en_adi,:sira,:isheader,:parentid,:url)",                                array(                                    "tr_adi" => $tr_adi,                                    "en_adi" => $en_adi,                                    "sira" => $sira,                                    "isheader" => 0,                                    "parentid" => $parentid,                                    "url" => $url                                )); 

but doesn't work. put print_r function $sth->errorinfo() , error:

    array     (         [0] => 42000         [1] => 1064         [2] => have error in sql syntax; check manual corresponds mysql server version right syntax use near '(en_adi, isheader, parentid, sira, tr_adi, url) values('blue sky bar  lounge', '' @ line 1     ) 

first of all, function should take table name first parameter instead of partial query.

secondly, should make effort escape column names reserved words in mysql; can wrapping them in backticks.

lastly, don't need use ->bindvalue() in loop; use question marks placeholders , pass array_values($data) in execution statement.

public function insert($table, $data) {     // try our best not use reserved words     $columns = array_map(function($column) {         return "`$column`";     }, array_keys($data));     // use question marks place holders     $values = array_fill(0, count($data), '?');     // construct query         $sql = sprintf('insert `%s` (%s) values (%s)',          $table,         join(',', $columns),         join(',', $values)     );     // prepare , execute     $stmt = $this->prepare($sql);     $stmt->execute(array_values($data));      $this->_numrows = $stmt->rowcount();     return $this->numrows ? 1 : 0; } 

to use it:

$db->insert('kategoriler', array(     "tr_adi" => $tr_adi,     "en_adi" => $en_adi,     "sira" => $sira,     "isheader" => 0,     "parentid" => $parentid,     "url" => $url )); 

Comments