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();
?>
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ć.