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ę