2013-03-16 11 views
5

Witam mam formularz pola 70/80, który muszę wstawić do tabeli, więc zamiast ręcznie tworzyć jedną wielką instrukcję wstawiania, najpierw utworzyłem tabelę w mojej db z nazwami wejść w formie Oto kod, który używam do tworzenia/zmienić stółMysqli update throwing Wywołanie funkcji member bind_param() error

function createTable($array, $memberMysqli) 
{ 
    foreach ($array as $key => $value) 
    { 
      //echo "<p>Key: ".$key." => Value: ".$value . "</p>"; 
      $query = "ALTER TABLE questionnaire ADD ".$key." text"; 

      if($stmt = $memberMysqli->prepare($query)) 
      { 
       $success = $stmt->execute(); 
      } 
    } 
     echo "<h1>Array count: ". count($array) ."</h1>" ; 
} 

to działa prawidłowo i zmieniona tabela dokładnie tak, jak chciałem. Teraz, aby wstawić wartości formularza, aby to zrobić, wykonuję podstawową jedną wstawkę pola przechowującą identyfikator wiersza, a następnie pętlę wszystkie zmienne pocztowe aktualizujące ten wiersz. Oto mój kod:

$stmt = $memberMysqli->prepare("INSERT INTO questionnaire(userid) VALUES (?)"); 

$stmt->bind_param('s', $_POST['userid']); 
$stmt->execute(); 
$rowid = $stmt->insert_id; 
$stmt->close(); 

$memberMysqli->autocommit(FALSE); 

function updateColumn($memberMysqli, $query, $uid, $value) 
{ 
    if ($value) 
    { 
     $stmt = $memberMysqli->prepare($query); 
     //Throws bind param error here 
     $stmt->bind_param("ss", $value, $uid); 
     $stmt->execute(); 
    } 
} 

function loopInputs($array, $memberMysqli, $rowid) 
{ 
    foreach ($array as $key => $formvalue) 
    { 
     var_dump($key); 
     updateColumn($memberMysqli, "UPDATE questionnaire SET $key = ? WHERE id = ?", $rowid, $formvalue); 
    } 
} 

loopInputs($_POST, $memberMysqli, $rowid); 

$memberMysqli->commit(); 
$memberMysqli->close(); 

Powoduje to błąd wiązania i nie mam pojęcia dlaczego. Każda pomoc byłaby świetna.

Odpowiedz

7

O, spróbujmy odpowiedzi kanonicznej.

Call to a member function (lub expects parameter 1 to be mysqli_result, boolean given dla stylu proceduralnym) nie jest błędem, ale sama tylko objawem jakiegoś innego problemu.
Ten komunikat o błędzie oznacza, że ​​obiekt nie został utworzony w miejscu, w którym powinien.

Wystąpił problem z utworzeniem obiektu $stmt.
Najprawdopodobniej jest to problem z zapytaniem. Musimy więc śledzić ten błąd.

Mysqli nie powie Ci, co się dzieje, o ile nie zostanie wyraźnie poproszony. Tak więc, zawsze musisz sprawdzić wynik każdej funkcji mysqli wchodzącej w interakcje z serwerem, a jeśli wynik jest FAŁSZ - sprawdź $mysqli->error.

Bardzo ważne jest również, aby przekonwertować komunikat o błędzie mysqli na błąd PHP, aby pozwolić mu działać zgodnie z ustawieniami raportowania błędów w całej witrynie.

Jeśli używasz mysqli_query() na całym kodzie aplikacji, nie zamykając go w jakiejś klasie pomocniczej, to dobrym sposobem na podniesienie błędu PHP, ponieważ powie ci również plik i numer wiersza, w którym wystąpił błąd

Tak, wszystkie prepare(), execute() i query() połączenia muszą być napisane w ten sposób:

$stmt = $mysqli->prepare($query) or trigger_error($mysqli->error."[$query]"); 

lub w stylu proceduralnym

$res = mysqli_query($mysqli,$query) or trigger_error(mysqli_error($mysqli)."[$query]"); 

we wszystkich skryptach
i od tego czasu użytkownik zostanie powiadomiony o przyczynie, dlaczego obiekt nie został utworzony. (Jeśli jesteś ciekawy tej składni, or, I've explained it here) Należy pamiętać, że zapytanie również zawarte w komunikacie o błędzie, aby umożliwić sprawdzenie go wizualnie i przetestować w innym środowisku.

Jednak, jeśli enkapsulacji zapytanie do jakiejś klasy, pliku i linii od błędu wyzwalania będzie zupełnie bezużyteczne, ponieważ będą one wskazywać na samej rozmowy, a nie kodu aplikacji, który spowodował pewien problem.Tak więc, gdy uruchomiony mysqli polecenia zamknięty, inny sposób muszą być stosowane:

$result = $mysqli->query($sql); 
if (!$result) { 
    throw new Exception($mysqli->error." [$query]"); 
} 

jako wyjątek zapewni Ci śladu stosu, który doprowadzi Cię do miejsca, z którego błędne zapytanie zostało nazwie.

Pamiętaj, że musisz ogólnie widzieć błędy PHP. Na żywo miejscu trzeba zajrzeć do logów błędów, tak, ustawienia muszą być

error_reporting(E_ALL); 
ini_set('display_errors',0); 
ini_set('log_errors',1); 

natomiast na lokalnym serwerze rozwoju to wszystko jest w porządku, aby błędy na ekranie:

error_reporting(E_ALL); 
ini_set('display_errors',1); 

i oczywiście nigdy nie powinieneś używać operatora tłumienia błędów (@) przed swoimi wyciągami.

+0

Dzięki! To poręczny fragment kodu, o którym powinienem wiedzieć. Problem polegał na tym, że kiedy zmieniałem tabelę, tworzyło się pole "prześlij", co spowodowało problem z aktualizacją. – lnelson92