Я получил таблицу 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());
}
}
Можете ли вы показать метод '$ this-> db-> query()'? – calcinai
Что означает «провал все время»? Есть ли ошибка? –
@GordonLinoff по ошибке Я имею в виду, что это не вставка, поэтому, когда я проверяю базу данных напрямую, она не вставлялась. Я регистрирую ошибки, но я получил пустое сообщение об ошибке из моего класса DBO. – Ozzy