Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] błąd function.mysqli-stmt-bind-param
Forum PHP.pl > Forum > Przedszkole
Endure
Witam,

Kończę robić swój pierwszy projekt sklepu internetowego, jest to moja praca licencjacka, skrypty związane z zamawianiem asortymentu chodzą, zamówienia zostają dodawane do bazy danych. Wszystko ok. Doszedłem do wniosku że fajnie by było dodawać/uaktualniać stan asortymentu w bazie danych z poziomu przeglądarki za pomocą formularza Tak wygląda mój formularz. Posiadam dwie kategorie opał oraz materiały budowlane, to każdej z tych kategorii mam osobny skrypt administracyjny za pomocą którego mogę zmieniać cenę, stan produktu. Tylko niestety z tych dwóch skryptów nie działa mi jeden, odpowiedzialny za dodawania materiałów budowlanych. Podczas próby dodania produktu dostaję komunikat:w skrypcie add_specific_bud.php' wystąpił błąd w wierszu 32:
mysqli_stmt_bind_param() [function.mysqli-stmt-bind-param]: Number of elements in type definition string doesn't match number of bind variables

Rozumiem treść Erorra ale nie potrafię sobie z tym poradzić.

CODE
<?php
ob_start();
// Dzięki temu skryptowi administrator ma możliwość dodawania materiałów budowlanych do bazy danych.


// Dołączyłem plik konfiguracyjny przed kodem PHP z powodu obsługi błędów.
require ('./config.inc.php');

// Ustawienie tytuł strony oraz dołączenie pliku nagłówka:
$page_title = 'Dodaj Budowlane';
include ('./header.html');
// Rozpoczynanie sesji odbywa się w pliku nagłówka.

// Dołączam plik ze skryptem którego zadaniem jest nawiązanie połączenia z bazą danych:
require(MYSQL);

$count = 10;

// Sprawdza, czy doszło do przesłania formularza:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

// Sprawdza kategorię:
if (isset($_POST['category']) && filter_var($_POST['category'], FILTER_VALIDATE_INT, array('min_range' => 1))) {

// Definiuje kwerendę:
$q = 'INSERT INTO specific_bud (general_bud_id, size_id, price, stock) VALUES (?, ?, ?, ?)';

// Przygotowuje zapytanie:
$stmt = mysqli_prepare($dbc, $q);

// Łączy zmienne:
mysqli_stmt_bind_param($stmt, 'iissdi', $_POST['category'], $size, $price, $stock); //+


// Zmienna której zadaniem jest przechowywanie liczby zmodyfikowanych wierszy:
$affected = 0;

// Za pomocą pętili przechodzi przez wszystkie zaktualizowane pozycje:
for ($i = 1; $i <= $count; $i++) {

// Sprawdza wymagane wartości:
if (filter_var($_POST['stock'][$i], FILTER_VALIDATE_INT, array('min_range' => 1))
&& filter_var($_POST['price'][$i], FILTER_VALIDATE_FLOAT)
&& ($_POST['price'][$i] > 0) ) {

// Przypisuje wartości do zmiennych:
$size = $_POST['size'][$i];
$price = $_POST['price'][$i];
$stock = $_POST['stock'][$i];

// Wykonuje kwerendę:
mysqli_stmt_execute($stmt); //+

// Dodaje liczbę zaktualizowanych wierszy:
$affected += mysqli_stmt_affected_rows($stmt); //+

} // Zakończenie instrukcji IF.

} // Zakończenie pętli FOREACH.

// Wyświetla liczbę zmodyfkowanych wierszy:
echo "<h4>$affected Liczba dodanych produktów!</h4>";

} else {
echo '<p class="error">Wybierz kategorię.</p>';
}

} // Zakończenie instrukcji IF której zadaniem jest sprawdzenie przesłania formularza.

?><h3>Dodaj Budowlane:</h3>

<form action="add_specific_bud.php" method="post" accept-charset="utf-8">

<fieldset><legend>Wypełnij formularz, aby dodać określony materiał budowlany do katalogu sklepu.</legend>

<div class="field"><label for="category"><strong>Ogólny typ materiału</strong></label><br />
<select name="category"><option>Wybierz...</option>
<?php
$q = 'SELECT id, category FROM general_bud ORDER BY category ASC';
$r = mysqli_query ($dbc, $q);
while ($row = mysqli_fetch_array ($r, MYSQLI_NUM)) {
echo "<option value=\"$row[0]\">$row[1]</option>\n";
}
?>
</select></div>

<table border="0" width="100%" cellspacing="5" cellpadding="5">
<thead>
<tr>
<th align="right">Wielkość</th>
<th align="center">Cena</th>
<th align="center">Stan magazynowy</th>
</tr>
</thead>
<tbody>
<?php


$q = 'SELECT id, size FROM sizes ORDER BY id ASC';
$r = mysqli_query ($dbc, $q);
$sizes = '';
while ($row = mysqli_fetch_array ($r, MYSQLI_NUM)) {
$sizes .= "<option value=\"$row[0]\">$row[1]</option>\n";
}




// Tworzy zestaw pól dla $count produktów:
for ($i = 1; $i <= $count; $i++) {
echo '<tr>
<td align="right"><select name="size[' . $i . ']">' . $sizes . '</select></td>
<td align="center"><input type="text" name="price[' . $i . ']" class="small" /></td>
<td align="center"><input type="text" name="stock[' . $i . ']" class="small" /></td>
</tr>
';

} // Zakończenie pętli FOR.

?></tbody>
</table>

<div class="field"><input type="submit" value="Dodaj produkty" class="button" /></div>

</fieldset>

</form>

<?php // Dołączam plik ze stopką:
include ('./footer.html');
ob_end_flush();
?>


Jak by ktoś mógł coś poradzić, byłbym wdzięczny. Do zakończenia projektu pozostał mi do rozwiązania ten jeden błąd z którym nie wiem jak się uporać.
viking
No ale czego nie rozumiesz? Bindujesz 6 iissdi do 4 parametrów.
Endure
ok dzięki wielkie, moje nie dopatrzenie już poprawiłem.

teraz mam tak:

  1. <?php
  2. // Dzięki temu skryptowi administrator ma możliwość dodawania materiałów budowlanych do bazy danych.
  3.  
  4.  
  5. // Dołączyłem plik konfiguracyjny przed kodem PHP z powodu obsługi błędów.
  6. require ('./config.inc.php');
  7.  
  8. // Ustawienie tytuł strony oraz dołączenie pliku nagłówka:
  9. $page_title = 'Dodaj Budowlane';
  10. include ('./header.html');
  11. // Rozpoczynanie sesji odbywa się w pliku nagłówka.
  12.  
  13. // Dołączam plik ze skryptem którego zadaniem jest nawiązanie połączenia z bazą danych:
  14. require(MYSQL);
  15.  
  16. $count = 10;
  17.  
  18. // Sprawdza, czy doszło do przesłania formularza:
  19. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  20.  
  21. // Sprawdza kategorię:
  22. if (isset($_POST['category']) && filter_var($_POST['category'], FILTER_VALIDATE_INT, array('min_range' => 1))) {
  23.  
  24. // Definiuje kwerendę:
  25. $q = 'INSERT INTO specific_bud (general_bud_id, size_id, price, stock) VALUES (?, ?, ?, ?, ?, ?)';
  26.  
  27. // Przygotowuje zapytanie:
  28. $stmt = mysqli_prepare($dbc, $q);
  29.  
  30. // Łączy zmienne:
  31. [color="#FF0000"] mysqli_stmt_bind_param($stmt, 'iissdi', $_POST['category'], $size, $price, $stock);[/color]
  32.  
  33. // Zmienna której zadaniem jest przechowywanie liczby zmodyfikowanych wierszy:
  34. $affected = 0;
  35.  
  36. // Za pomocą pętili przechodzi przez wszystkie zaktualizowane pozycje:
  37. for ($i = 1; $i <= $count; $i++) {
  38.  
  39. // Sprawdza wymagane wartości:
  40. if (filter_var($_POST['stock'][$i], FILTER_VALIDATE_INT, array('min_range' => 1))
  41. && filter_var($_POST['price'][$i], FILTER_VALIDATE_FLOAT)
  42. && ($_POST['price'][$i] > 0) ) {
  43.  
  44. // Przypisuje wartości do zmiennych:
  45. $size = $_POST['size'][$i];
  46. $price = $_POST['price'][$i];
  47. $stock = $_POST['stock'][$i];
  48.  
  49. // Wykonuje kwerendę:
  50. [color="#FF0000"]mysqli_stmt_execute($stmt);[/color] //+
  51.  
  52. // Dodaje liczbę zaktualizowanych wierszy:
  53. [color="#FF0000"]$affected += mysqli_stmt_affected_rows($stmt);[/color] //+
  54.  
  55. } // Zakończenie instrukcji IF.
  56.  
  57. } // Zakończenie pętli FOREACH.
  58.  
  59. // Wyświetla liczbę zmodyfkowanych wierszy:
  60. echo "<h4>$affected Liczba dodanych produktów!</h4>";
  61.  
  62. } else {
  63. echo '<p class="error">Wybierz kategorię.</p>';
  64. }
  65.  
  66. } // Zakończenie instrukcji IF której zadaniem jest sprawdzenie przesłania formularza.
  67.  
  68. ?><h3>Dodaj Budowlane:</h3>
  69.  
  70. <form action="add_specific_bud.php" method="post" accept-charset="utf-8">
  71.  
  72. <fieldset><legend>Wypełnij formularz, aby dodać określony materiał budowlany do katalogu sklepu.</legend>
  73.  
  74. <div class="field"><label for="category"><strong>Ogólny typ materiału</strong></label><br />
  75. <select name="category"><option>Wybierz...</option>
  76. <?php
  77. $q = 'SELECT id, category FROM general_bud ORDER BY category ASC';
  78. $r = mysqli_query ($dbc, $q);
  79. while ($row = mysqli_fetch_array ($r, MYSQLI_NUM)) {
  80. echo "<option value=\"$row[0]\">$row[1]</option>\n";
  81. }
  82. ?>
  83. </select></div>
  84.  
  85. <table border="0" width="100%" cellspacing="5" cellpadding="5">
  86. <thead>
  87. <tr>
  88. <th align="right">Wielkość</th>
  89. <th align="center">Cena</th>
  90. <th align="center">Stan magazynowy</th>
  91. </tr>
  92. </thead>
  93. <tbody>
  94. <?php
  95.  
  96.  
  97. $q = 'SELECT id, size FROM sizes ORDER BY id ASC';
  98. $r = mysqli_query ($dbc, $q);
  99. $sizes = '';
  100. while ($row = mysqli_fetch_array ($r, MYSQLI_NUM)) {
  101. $sizes .= "<option value=\"$row[0]\">$row[1]</option>\n";
  102. }
  103.  
  104.  
  105.  
  106.  
  107. // Tworzy zestaw pól dla $count produktów:
  108. for ($i = 1; $i <= $count; $i++) {
  109. echo '<tr>
  110. <td align="right"><select name="size[' . $i . ']">' . $sizes . '</select></td>
  111. <td align="center"><input type="text" name="price[' . $i . ']" class="small" /></td>
  112. <td align="center"><input type="text" name="stock[' . $i . ']" class="small" /></td>
  113. </tr>
  114. ';
  115.  
  116. } // Zakończenie pętli FOR.
  117.  
  118. ?></tbody>
  119. </table>
  120.  
  121. <div class="field"><input type="submit" value="Dodaj produkty" class="button" /></div>
  122.  
  123. </fieldset>
  124.  
  125. </form>
  126.  
  127. <?php // Dołączam plik ze stopką:
  128. include ('./footer.html');
  129. ?>


i wywala mi błąd że w liniach kolejno tych na czerwono mam:
mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given
mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given
mysqli_stmt_affected_rows() expects parameter 1 to be mysqli_stmt, boolean given
abort
Pokaż, co masz w $stmt po wykonaniu kodu "$stmt = mysqli_prepare($dbc, $q);" - print_r albo var_dump.
Bo przypuszczam, że niekoniecznie to, co sądzisz, że masz.
b4rt3kk
Najwidoczniej tu jest błąd:

  1. $stmt = mysqli_prepare($dbc, $q);


bo zamiast uchwytu zwraca boolean, a mianowicie false. Zgodnie ze specyfikacją:

Kod
mysqli_prepare() returns a statement object or FALSE if an error occurred.


$dbc nie jest nigdzie wcześniej zainicjowane i najwidoczniej nie jest uchwytem do bazy danych.

PS. zalecam umieszczanie kodu PHP między znacznikami PHP, bo to bardzo ciężko się czyta gdy trzeba przewijać. Wyedytuj jeśli możesz.
abort
Cytat(b4rt3kk @ 24.10.2012, 18:36:20 ) *
$dbc nie jest nigdzie wcześniej zainicjowane i najwidoczniej nie jest uchwytem do bazy danych.

Najwidoczniej nie jest uchwytem. Ale czy jest zainicjowane? Nie mamy podglądu do require'owanych plików:
  1. require ('./config.inc.php');
  2. require(MYSQL);

Zawsze może próbować być inicjalizowane - ale bezskutecznie.
Endure
Cytat(abort @ 24.10.2012, 18:32:36 ) *
Pokaż, co masz w $stmt po wykonaniu kodu "$stmt = mysqli_prepare($dbc, $q);" - print_r albo var_dump.
Bo przypuszczam, że niekoniecznie to, co sądzisz, że masz.



nie wiem czy o to Ci chodziłoLINK ( nigdy nie używałem - print_r albo var_dump poczytam coś o tym i coś pokombinuję jak mi wyjdzie)
abort
Chodziło mi o podanie, co zwraca/wypisuje print_r ($stmt).
W załączonym pliku jest na samym końcu - ta zmienna nie zawiera żadnej wartości.
Masz niezainicjalizowane połączenie do bazy (lub: źle zainicjowane, z błędami itp).

Zainteresuj się http://www.php.net/manual/en/mysqli-stmt.errno.php (przykłady użycia: example #1, #2)
Endure
Ok dzięki za wskazówki, dziwne, bo strona jest na serwerze, czyta masę innych rzeczy z MySQL, inne pliki znajdujące się w tym samym katalogu korzystają z tego samego pliku odpowiedzialnego za połączenie z bazą chodzą bez problemu, dodaję do bazy artykuły z innej kategorii. No ale tu widocznie mam gdzieś błąd..

dałem var_dump($stmt) pod;
$stmt = mysqli_prepare($dbc, $q);

wyświetla mi na stronie:
bool(false)

dzięki za linka poczytam może coś wyjdzie a jak nie to sobie daruję smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.