2012-06-10 12 views
20
// BUILD VALUES 
$count = count($matches); 
for($i = 0; $i < $count; ++$i) { 
    $values[] = '(?)'; 
} 
// INSERT INTO DATABASE 
$q = $this -> dbc -> prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash"); 
$q -> execute($matches); 

Kod powyżej nie następujący błądSQLSTATE [HY093] Nieprawidłowa liczba parametrów: parametru nie zdefiniowano

SQLSTATE [HY093] Nieprawidłowa liczba parametrów: parametr niezdefiniowane

Chociaż jest wywoływana przed wykonaniem count($matches) == count($values)?

Co się tutaj dzieje?

+4

Czy próbowałeś podać wartości array_values ​​($ matches)? –

+0

Dlaczego 'ON DUPLICATE KEY UPDATE hash = hash'? Może również "WSTAW IGNOWAĆ ...". Czy chcesz zrobić 'UPDATE hash = VALUES (hash)'? – eggyal

+0

Czy tablica '$ values' zawierała coś przed pętlą? Poza tym, dlaczego nie przygotować pojedynczego 'hasła INSERT INTO (hash) VALUES (?)' I wykonać go wiele razy? – eggyal

Odpowiedz

36

Ten błąd otrzymujesz:

SQLSTATE [HY093]: nieprawidłowy numer parametru: parametr nie został zdefiniowany

jest fakt, że liczba elementów w $values & $matches nie jest ten sam lub $matches zawiera więcej niż 1 element.

Jeśli $matches zawiera więcej niż 1 elementu, niż wkładka nie powiedzie się, ponieważ nie jest nazwa tylko 1 kolumna mowa w zapytaniu (hash)

Jeśli $values & $matches nie zawierają taką samą liczbę elementów, a następnie insert również zawiedzie, ponieważ zapytanie oczekuje x params, ale odbiera dane y $matches.

Uważam, że będziesz musiał również upewnić się, że kolumna hash ma również unikalny indeks.

Spróbuj kod here:

<?php 

/*** mysql hostname ***/ 
$hostname = 'localhost'; 

/*** mysql username ***/ 
$username = 'root'; 

/*** mysql password ***/ 
$password = ''; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password); 
    /*** echo a message saying we have connected ***/ 
    echo 'Connected to database'; 
    } 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 


$matches = array('1'); 
$count = count($matches); 
for($i = 0; $i < $count; ++$i) { 
    $values[] = '?'; 
} 

// INSERT INTO DATABASE 
$sql = "INSERT INTO hashes (hash) VALUES (" . implode(', ', $values) . ") ON DUPLICATE KEY UPDATE hash='hash'"; 
$stmt = $dbh->prepare($sql); 
$data = $stmt->execute($matches); 

//Error reporting if something went wrong... 
var_dump($dbh->errorInfo()); 

?> 

Będziesz musiał dostosować go trochę.

struktura Tabela użyłem jest here:

CREATE TABLE IF NOT EXISTS `hashes` (
    `hashid` int(11) NOT NULL AUTO_INCREMENT, 
    `hash` varchar(250) NOT NULL, 
    PRIMARY KEY (`hashid`), 
    UNIQUE KEY `hash1` (`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

kod został uruchomiony na mój serwer XAMPP, który używa PHP 5.3.8 z MySQL 5.5.16.

Mam nadzieję, że to pomoże.

+0

Dzięki temu rozwiązany! – Griff

+0

nie martw się, tutaj, aby pomóc i nauczyć się – Haroon

+2

Świetna odpowiedź, właśnie wpadłem na to, ponieważ zdefiniowałem dwie kolumny z tym samym identyfikatorem - ': example', który powinien być również punktem do sprawdzenia! – Darren

1

SQLSTATE [HY093]: nieprawidłowy numer parametru: Parametr nie został zdefiniowany

Niestety ten błąd nie jest opisowe dla wielu różnych problemów dotyczących tego samego problemu - błąd wiążącego. Nie określa również, gdzie znajduje się błąd, więc Twój problem nie musi być konieczny do wykonania, ale instrukcja SQL, która była już "przygotowana".

Są ewentualne błędy i ich rozwiązania:

  1. Istnieje niezgodność parametr - liczbę pól nie pasuje do parametrów, które zostały złączone. Uważaj na tablice w tablicach.Aby dwukrotnie sprawdzić - użyj var_dump ($ var). "print_r" niekoniecznie pokazuje, czy indeks w tablicy jest inną tablicą (jeśli tablica zawiera jedną wartość), natomiast zmienna_dostarcza.

  2. Podjęto próbę powiązania przy użyciu tej samej wartości wiązania, na przykład: ": hash" i ": hash". Każdy indeks musi być unikalny, nawet jeśli logicznie ma sens używanie go dla dwóch różnych części, nawet jeśli ma tę samą wartość. (jest podobny do stałej, ale bardziej przypomina element zastępczy)

  3. Jeśli wiążisz więcej niż jedną wartość w instrukcji (jak to często bywa w przypadku "INSERT"), musisz bindParam, a następnie bindValue do Parametry. Tutaj proces polega na powiązaniu parametrów z polami, a następnie powiązaniu wartości z parametrami.

    // Code snippet 
    $column_names = array(); 
    $stmt->bindParam(':'.$i, $column_names[$i], $param_type); 
    $stmt->bindValue(':'.$i, $values[$i], $param_type); 
    $i++; 
    //..... 
    
  4. Kiedy wiążących wartości do COLUMN_NAMES lub table_names można użyć `ale nie jest to konieczne, ale upewnij się, aby być spójne.

  5. Każda wartość w cudzysłowach pojedynczych jest zawsze traktowana jako ciąg znaków i nie będzie odczytywana jako nazwa kolumny lub tabeli ani symbol zastępczy, z którym ma wiązać.

+0

Dzięki za powód nr 2, zostałeś oszołomiony do Znalazłem to tutaj. – swa66

Powiązane problemy