Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] błąd function.mysqli-stmt-bind-param
Endure
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 19.05.2011

Ostrzeżenie: (0%)
-----


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ć.

Ten post edytował Endure 24.10.2012, 16:30:37
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


No ale czego nie rozumiesz? Bindujesz 6 iissdi do 4 parametrów.
Go to the top of the page
+Quote Post
Endure
post
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 19.05.2011

Ostrzeżenie: (0%)
-----


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

Ten post edytował Endure 24.10.2012, 18:00:09
Go to the top of the page
+Quote Post
abort
post
Post #4





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #5





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.

Ten post edytował b4rt3kk 24.10.2012, 17:38:47
Go to the top of the page
+Quote Post
abort
post
Post #6





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Endure
post
Post #7





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 19.05.2011

Ostrzeżenie: (0%)
-----


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)

Ten post edytował Endure 24.10.2012, 19:25:41
Go to the top of the page
+Quote Post
abort
post
Post #8





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


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)
Go to the top of the page
+Quote Post
Endure
post
Post #9





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 19.05.2011

Ostrzeżenie: (0%)
-----


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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 04:33