Quantcast
Viewing all articles
Browse latest Browse all 21942

Błąd zapytania PDO dla pewnych danych

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ę


Viewing all articles
Browse latest Browse all 21942