2013-09-10 3 views
0

Я получил таблицу MySQL с полями a1, a2, a3, b1, ..., d1, d2, каждое поле было объявлено как BOOLEAN в СОЗДАТЬ заявление. (Я также пробовал TINYINT(1), но имел ту же проблему).MySQL Вставить неудачу динамически, но работая непосредственно

Тогда у меня есть эта функция PHP, которая получает данные из HTML-формы:

public function add($a) { 
    $sql = "INSERT INTO property_classification 
      (a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2) 
      VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);"; 

    // creating the classification_id 
    // e.g. "a1a2a3" => ["a1","a2","a3"] 
    $classifications = str_split($a['classifications'], 2); 
    $data = array(); 
    // compile $data array 
    foreach (self::$classification_fields as $classification) { 
     // if user array contained any classification, set to true 
     if (in_array($classification, $classifications)) { 
      $data[$classification] = "1"; // I tried `true` too 
     } else { 
      $data[$classification] = "0"; // I tried `false` here 
     } 
    } 
    // set type for binding PDO params 
    foreach ($data as $key=>$value) settype($data[$key], 'int'); // tried 'bool' 
    $this->db->query($sql, $data); 
    $a['classification_id'] = $this->db->lastInsertId(); 
    $this->log($a['classification_id']); // Output: "0" 
    ... 

Выход должен быть действительным ID от 1+, но вставка не удалась, так что lastInsertId() вернулся 0.

Я проверил, что $sql компилируется, он пришел к этому:

INSERT INTO property_classification (a1, a2, a3, b1, b2, b3, b4, b5, b6, b7, b8, c1, c2, c3, d1, d2) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,?,?,?,? ,,,,,)???;

Я также выход $data с кодом: implode(",",$data); и он дал мне этот выход:

1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0

Это было прекрасно, потому что входной сигнал был "a1a2".

Единственная проблема сейчас я не понимаю, почему запрос не удается все время, потому что я поставил два бита вместе, как так:

INSERT INTO property_classification (a1, a2, a3 , b1, b2, b3, b4, b5, b6, b7, b8, c1, c2, c3, d1, d2) ЦЕННОСТИ (1,1,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0);

Тогда я выполнил этот запрос в MySQL Query Browser, и она работала.

Так почему же он не прошел через PDO?


ДБО класс

function query($sql, $data) { 
    try { 
     $this->query = $this->db->prepare($sql); 
     if (!is_null($data) && is_array($data)) 
      $this->query->execute($data); 
     else 
      $this->query->execute(); 
    } catch (PDOException $e) { 
     array_push($this->log, $e->getMessage()); 
    } 
} 
+0

Можете ли вы показать метод '$ this-> db-> query()'? – calcinai

+0

Что означает «провал все время»? Есть ли ошибка? –

+0

@GordonLinoff по ошибке Я имею в виду, что это не вставка, поэтому, когда я проверяю базу данных напрямую, она не вставлялась. Я регистрирую ошибки, но я получил пустое сообщение об ошибке из моего класса DBO. – Ozzy

ответ

3

Так как вы на самом деле передачи ассоциативного массива в PDO, вы можете связать с именованными параметрами. Для использования ? или позиционных заполнителей требуется стандартная индексированная матрица. Если вы против использования названных параметров, просто замените $data[$classification] = на $data[] =

Попробуйте ниже.

public function add($a) { 
    $sql = "INSERT INTO property_classification 
      (a1,a2,a3,b1,b2,b3,b4,b5,b6,b7,b8,c1,c2,c3,d1,d2) 
      VALUES(:a1,:a2,:a3,:b1,:b2,:b3,:b4,:b5,:b6,:b7,:b8,:c1,:c2,:c3,:d1,:d2);"; 

    // creating the classification_id 
    // e.g. "a1a2a3" => ["a1","a2","a3"] 
    $classifications = str_split($a['classifications'], 2); 
    $data = array(); 
    // compile $data array 
    foreach (self::$classification_fields as $classification) 
     $data[$classification] = in_array($classification, $classifications) ? 1 : 0; 

    $this->db->query($sql, $data); 
    $a['classification_id'] = $this->db->lastInsertId(); 
    $this->log($a['classification_id']); // Output: "0" 
+0

Я ненавижу его когда я так делаю! Никогда не осознавал, что все время я проходил ассоциативный массив, где, как правило, я передаю нормальный массив с параметрами '?'. Поэтому, когда я изменил на named params, то есть ': a1,: a2', как вы предположили, что он работает на 100%. Спасибо за помощь :) – Ozzy

+1

Иногда это просто занимает вторую пару глаз! – calcinai

+0

Полностью согласен с вами! – Ozzy

Смежные вопросы