Nie zgodna liczba zmiennych

0

Witam wszystkich. Jestem początkujący. Korzystając z przykładów z książki J. Ducketta próbuję stworzyć program oparty na bazie danych. Podczas pobierania z bazy otrzymuję komunikat błędu, z którym walczę bezskutecznie do dłuższego czasu. Oto komunikat:

> SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Poniżej wybrane element kodu:

<?php
$typ        = 'mysql';                 
$serwer     = 'localhost';           
$db         = '*********';      
$port       = '3306';                      
$kodowanie  = 'utf8mb4';              
$uzytkownik = 'root';                   
$haslo      = '';
$dsn        = "$typ:host=$serwer;dbname=$db;port=$port;charset=$kodowanie";


class BazaI extends PDO
{
    public function __construct(string $dsn, string $uzytkownik, string $haslo)
    { 
        parent::__construct($dsn, $uzytkownik, $haslo, $opcje);
    }    

    public function wykonajSQL(string $sql, array $argumenty = null)
    {
        if (!$argumenty) {                               
            return $this->query($sql);                  
        }
        $instrukcja = $this->prepare($sql);            
        $instrukcja->execute($argumenty);               
        return $instrukcja;                              
    }
}



class CMS
{
    protected $pytajacy    = null;                 
    
    public function __construct($dsn, $uzytkownik, $haslo)
    {
        $this->db = new BazaI($dsn, $uzytkownik, $haslo); 
    }
    public function pobierzPytajacego()
    {
        if ($this->pytajacy === null) {                    
            $this->pytajacy = new Pytajacy($this->db);   
        }
        return $this->pytajacy;                            
    }
    
    
    
    public function pobierzIdPytajacego(array $email)  
    {
        $sql = "SELECT id_pytajacego
                FROM   pytajacy
                WHERE  e_mail = ':e-mail';";
        return $this->db->wykonajSQL($sql, $email);
    }
}


$email = ['e-mail' => 'ggg@op.hs'] ;
$czesc['id_pytajacego'] = $cms->pobierzPytajacego()->pobierzIdPytajacego($email)->fetch(); 

Tablica $email jest stworzona pierwszy raz, w miejscu w którym widać i ma tylko 1 parę elementów.
Bardzo proszę o pomoc

2

Pewnie chodzi o to zapytanie:

$sql = "SELECT id_pytajacego
   FROM   pytajacy
   WHERE  e_mail = ':e-mail';";

Traktuje ':e-mail' jako string. Wywal '.

0

Pozbyłem się apostrofów i otrzymałem komunikat: Invalid parameter number: parameter was not defined.
Poprzednio, kiedy używałem parametrów bez apostrofów odesłał mnie do manuala MariaDB.

0
tomsal napisał(a):

Pozbyłem się apostrofów i otrzymałem komunikat: Invalid parameter number: parameter was not defined.
Poprzednio, kiedy używałem parametrów bez apostrofów odesłał mnie do manuala MariaDB.

Zdebuguj sobie co wysyłasz jako argument do zapytania.

0

Dla pewności debuguj. Możesz na początku użyć var_dump
Funkcja przyjmuje tablicę (array) jako parametr.
Potem chcesz użyć tej tablicy w zapytaniu jako string i to pierwszy potencjalny błąd.
Potem przekazujesz zmienna $email dalej ale już w funkcji prepre() przekazujesz tylko sql. Nie ma nigdzie bindowania. Przekazujesz jednak do execute().
Zobacz tutaj: https://www.php.net/manual/en/pdostatement.bindparam.php
Bindowanie to przypisanie zmiennych do tych zastępowanych potem literałów zaczynających się od :

0

Użyłem

echo is_string($email['e-mail']);

otrzymałem 1

Rzeczywiście parametr jest stringiem. Jak sobie z tym poradzić?

0

Tak, spróbuje zmienić sposób przekazywania parametrów

1 użytkowników online, w tym zalogowanych: 0, gości: 1