2013-07-19 3 views
1

Я набрал класс, который он расширил из класса PDO и использовал его в моем проекте. Но в методе вставки получите ошибку.PHP PDO Вставить метод класса не работает

На последующих кодов для вставки в таблицу:

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 as $key => $value) { 

     $sth->bindValue(":$key",$value); 
    } 
    $this->_numrows = $sth->rowCount(); 

    if($this->_numrows > 0) 
     return 1; 
    else 
     return 0; 
} 

И используя подобный проект:

 return $this->db->insert("INSERT INTO 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 
           )); 

Но не работает. Я положил функцию print_r с помощью $ sth-> errorInfo() и получил ошибку:

Array 
    (
     [0] => 42000 
     [1] => 1064 
     [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(en_adi, isHeader, parentID, sira, tr_adi, url) VALUES('Blue Sky Bar Lounge', '' at line 1 
    ) 
+0

В пути вы будете в конечном итоге с 'подготовить (" INSERT INTO таблицы (столбец, столбец, столбец) VALUES (вал, знач, знач) VALUES (знач , val, val) ")', потому что вы объявили VALUES в переданном параметре и в функции подготовки –

+0

SQL и PHP - разные языки. Используйте 'var_dump (" $ table ($ field_Names) VALUES ($ field_Values) ")', чтобы определить, какой запрос вы пытаетесь запустить. –

+1

PHP не имеет 'E_DOESNT_WORK' –

ответ

1

Прежде всего, ваша функция должна принимать имя таблицы в качестве первого параметра вместо частичный запрос.

Во-вторых, вам следует попытаться избежать имен столбцов, которые зарезервированы в MySQL; вы можете сделать это, обернув их в backticks.

И, наконец, вам не нужно использовать ->bindValue() в петле; просто используйте вопросительные знаки в качестве заполнителей и передайте array_values($data) в заявлении о выполнении.

public function insert($table, $data) 
{ 
    // try our best not to use reserved words 
    $columns = array_map(function($column) { 
     return "`$column`"; 
    }, array_keys($data)); 
    // just use question marks as the place holders 
    $values = array_fill(0, count($data), '?'); 
    // construct the query  
    $sql = sprintf('INSERT INTO `%s` (%s) VALUES (%s)', 
     $table, 
     join(',', $columns), 
     join(',', $values) 
    ); 
    // prepare and execute it 
    $stmt = $this->prepare($sql); 
    $stmt->execute(array_values($data)); 

    $this->_numrows = $stmt->rowCount(); 
    return $this->numrows ? 1 : 0; 
} 

Чтобы использовать его:

$db->insert('kategoriler', array(
    "tr_adi" => $tr_adi, 
    "en_adi" => $en_adi, 
    "sira" => $sira, 
    "isHeader" => 0, 
    "parentID" => $parentID, 
    "url" => $url 
)); 
+0

Очень спасибо мужчине за этот замечательный код :) – Mesuti

2

Вы используете свою функцию неправильно. Вы не должны передавать запрос с полями и заполнителями как параметр $table, а только имя таблицы. Также, как @ N.B. упоминается в запросе, вы забыли выполнить запрос:

public function insert($table, $data) 
{ 
    ksort($data); 
    $field_Names = implode(', ',array_keys($data)); 
    $field_Values = ':'.implode(', :',array_keys($data)); 
    $sth = $this->prepare("INSERT INTO $table ($field_Names) VALUES($field_Values)"); 

    foreach ($data as $key => $value) { 
    $sth->bindValue(":$key",$value); 
    } 

    $sth->execute(); 
    $this->_numrows = $sth->rowCount(); 

    if($this->_numrows > 0) 
    return 1; 
    else 
    return 0; 
    } 
} 

И вы должны использовать его как:

return $this->db->insert("kategoriler", 
          array(
           "tr_adi" => $tr_adi, 
           "en_adi" => $en_adi, 
           "sira" => $sira, 
           "isHeader" => 0, 
           "parentID" => $parentID, 
           "url" => $url 
          )); 
+3

Он также пропускает $ sth-> execute() между прочим. –

+0

@ N.B. true, отредактирован ... –

+0

Нет, я отправляю с того места, где я использовал этот текст «INSERT INTO». Дамп $ sth на экране, и я получаю следующую строку: 'INSERT INTO kategoriler (tr_adi, en_adi, sira, isHeader, parentID, url) VALUES (: tr_adi,: en_adi,: sira,: isHeader,: parentID,: url) (en_adi, isHeader, parentID, sira, tr_adi, url) VALUES (: en_adi,: isHeader,: parentID,: sira,: tr_adi,: url) ' – Mesuti