Witam.
Mam problem tego rodzaju że dla pewnych danych zapytanie PDO zwraca błąd a dla innych działa najzupełniej prawidłowo.
Zapytanie to dodaje nowe tagi do bazy danych.
Najpierw pobrane tagi w formie stringa czyszczę, zamieniam na tablicę i usuwam duplikaty.
public function createTags(){ if(isset($_POST['tags']) && $_POST['tags']!=""){ if($this->cleanTags($_POST['tags'])) { $string = mb_strtolower(rtrim($_POST['tags'],',')); $this->tags = explode(',', str_replace(' ','',$string)); foreach ($this->tags as $tag){ $tagInArr = array_keys($this->tags,$tag); if(count($tagInArr)>1){ for($i=1;$i<count($tagInArr);$i++){ unset($this->tags[$tagInArr[$i]]); } } } return true; } } return false; } private function cleanTags($string){ $cleanString = htmlspecialchars(strip_tags($string),ENT_QUOTES,'UTF-8'); if($cleanString!==$string) return false; return true; }
W kolejnej metodzie dokonuje wpisu do bazy danych:
public function updateTags($tags){ $placeholders = array(); echo 'Liczba tagów '.count($tags).'<br>'; foreach($tags as $d){ $placeholders[] = '(' .'?' . ')'; } $a = implode(',',$placeholders); echo 'Placeholdery '.$a.'<br>'; try { $checkTag = $this->db->prepare("INSERT INTO tags (name) VALUES ". implode(',',$placeholders)." ON DUPLICATE KEY UPDATE name=name "); var_dump($tags); $checkTag->execute($tags); }catch (PDOException $e) { echo $e->getMessage(); } }
I dla pewnych tagów gdzie jeśli wystąpiły duplikaty PDO zwraca błąd :
SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Ale według tego co pokazuje echo to liczba placeholderów jest taka sama jak liczba danych w tablicy pokazana przez var_dump.
Przykład:
Tagi wpisane do pola input w formularzu: "ma,ma,ka,ma,"
I komunikaty po próbie wykonania skryptu:
2
(?),(?)
array(2) { [0]=> string(2) "ma" [2]=> string(2) "ka" } SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Więc według tego wszystko powinno zadziałać. Co ciekawe jeśli wystąpią powtórzenia tagów w innej konfiguracji to skrypt działa.
Poniżej lista przykladowa lista tagów działających oraz nie przesyłanych w formularzu.
BŁĘDNA:
ma,ma,ka,ma,
ma,ma,ka
ma, ka, aha,ma, la, ma
ma, ka, aha,ma, la,
ma, ka, aha,ma, la
OK:
ma,ka,ma
ma,ma,ma
ka,ma,ma,ma
ka,ma,ma,ma,ka
ka,ma,ka,ma,ma,ka
ma, ka, aha, la,
Proszę o wyjaśnienie co jest nie tak.
Dziękuję