Strict Standards: Resource ID#33 used as offset, casting to integer (33) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#35 used as offset, casting to integer (35) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Вставка записей в БД из формы
ТвойWeb » WebMaster класс » PHP/Perl » Вставка записей в БД из формы

Страниц (2): [1] 2 »
 

1. Lera - 05 Июня, 2007 - 07:19:50 - перейти к сообщению
Здравствуйте, уважаемые форумчане!

Сначала хочу поблагодарить организаторов этого форума и сайта, так как неоднократно пользовалась имеющейся здесь информацией, и свой первый сайт написала с помощью уроков на "ТвойВеб".

Хочу попросить помощи. Сейчас создаю сайт е-коммерс, все делаю по учебнику, так как сама почти ничего не понимаю в РНР, пользуюсь Dreamweaver. Возникла такая проблема: пишу страничку, где посетители могут добавлять товары в корзину. Есть, к примеру, 10 товаров, выбор делается с помощью чекбоксов, и потом все выделенное должно отправляться одной кнопкой "Купить" в БД. Но почему-то делается только одна запись в БД. Уже несколько дней бьюсь над этой задачей, и никак! Очень надеюсь на вашу помощь.

Код формуляра:
CODE:
<?php if(isset($_SESSION['MM_Username'])); {?>
<form method="post" name="form1" action="<?php echo $editFormAction; ?>">

<?php do { ?>
<img src="<?php echo $row_montages['img']; ?>" alt="<?php echo $row_montages['nom']; ?>">
<input type="checkbox" name="article" value="<?php echo $row_montages['nom']; ?>">
<?php } while ($row_montages = mysql_fetch_assoc($montages)); ?>

<input type="hidden" name="client" value="<?php echo $_SESSION['MM_Username'];?>">
<input type="submit" value="Commander">
<input type="hidden" name="MM_insert" value="form1">

</form>
<?php }?>


И код скрипта вставки записи в БД:
CODE:
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
$insertSQL = sprintf("INSERT INTO bp_panier (client, article) VALUES (%s, %s)",
GetSQLValueString($_POST['client'], "text"),
GetSQLValueString($_POST['article'], "text"));

mysql_select_db($database_bp, $bp);
$Result1 = mysql_query($insertSQL, $bp) or die(mysql_error());

$insertGoTo = "panier.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
?>

Пожалуйста, посмотрите где ошибка, сама не справляюсь! Заранее благодарю!
2. Furax - 05 Июня, 2007 - 23:59:29 - перейти к сообщению
Lera
У тебя все чекбоксы идут под одним именем (article). Добавь нумерацию, например так:
CODE:
<?php if(isset($_SESSION['MM_Username'])); {?>
<form method="post" name="form1" action="<?php echo $editFormAction; ?>">

<?php for ($i=0; mysql_fetch_assoc($montages)); $i++) { ?>
<img src="<?php echo $row_montages['img']; ?>" alt="<?php echo $row_montages['nom']; ?>">
<input type="checkbox" name="article[<?php echo $i; ?>]" value="<?php echo $row_montages['nom']; ?>">
<?php } ?>

<input type="hidden" name="client" value="<?php echo $_SESSION['MM_Username'];?>">
<input type="submit" value="Commander">
<input type="hidden" name="MM_insert" value="form1">

</form>
<?php } ?>

Ну и во втором скрипте сделай скидку на то, что у тебя article - это уже массив, надо, соответственно, в цикле (foreach) по нему пройтись и добавить все содержащиеся в нём запросы...

Кстати, у тебя, похоже, первый вызов mysql_fetch_assoc был до кода, который ты привета - его в случае моего кода надо будет убрать...
3. Lera - 06 Июня, 2007 - 07:58:46 - перейти к сообщению
Furax, спасибо за ответ!
Я немного изменила твой код, потому что выводилась одна и та же картинка во всех 10 случаях. Вот моя форма теперь выглядит так:

CODE:
<form method="POST" name="form1" action="<?php echo $editFormAction; ?>">
<?php for ($i=0; mysql_fetch_assoc($montages); $i++) {
do { ?>
<img src="<?php echo $row_montages['img']; ?>" alt="<?php echo $row_montages['nom']; ?>">
<input type="checkbox" name="article[<?php echo $i;?>]" value="<?php echo $row_montages['nom']; ?>">
<input type="hidden" name="client" value="<?php echo $_SESSION['MM_Username'];?>">
<input type="hidden" name="quantite" value="1">
<?php } while ($row_montages = mysql_fetch_assoc($montages));
}?>

<input type="submit" value="Commander">
<input type="hidden" name="MM_insert" value="form1">
</form>


При этом у меня почему-то пропускается картинка №2 Не понял

У меня еще огромная просьба, помоги мне, пожалуйста с foreach, совсем не понимаю куда его привязать. В первом посте я написала "почти ничего не понимаю в РНР", кажется надо исправить на "совсем ничего не понимаю в РНР" Огорчение
4. Furax - 06 Июня, 2007 - 08:08:17 - перейти к сообщению
Lera
Пардон, очепятался... Конечно же, надо писать так:
CODE:
<?php if(isset($_SESSION['MM_Username'])); {?>
<form method="post" name="form1" action="<?php echo $editFormAction; ?>">

<?php for ($i=0; $row_montages=mysql_fetch_assoc($montages)); $i++) { ?>
<img src="<?php echo $row_montages['img']; ?>" alt="<?php echo $row_montages['nom']; ?>">
<input type="checkbox" name="article[<?php echo $i; ?>]" value="<?php echo $row_montages['nom']; ?>">
<?php } ?>

<input type="hidden" name="client" value="<?php echo $_SESSION['MM_Username'];?>">
<input type="submit" value="Commander">
<input type="hidden" name="MM_insert" value="form1">

</form>
<?php } ?>
И переменная $row_montages в начале ничего содержать не должна...

Lera пишет:
совсем ничего не понимаю в РНР

Не расстраивайся! Я сам ещё только учусь, а конец света всё ближе... Эх... Что-то я не то сказал! Недовольство, огорчение

Насколько я понимаю, писать во втором скрипте надо как-нибудь так:
CODE:
<?php
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue;

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

mysql_select_db($database_bp, $bp);

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
foreach ($_POST['article'] as $article)
{
$insertSQL = sprintf("INSERT INTO bp_panier (client, article) VALUES (%s, %s)",
GetSQLValueString($_POST['client'], "text"),
GetSQLValueString($article, "text"));

$Result1 = mysql_query($insertSQL, $bp) or die(mysql_error());
}

$insertGoTo = "panier.php";
if (isset($_SERVER['QUERY_STRING'])) {
$insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
$insertGoTo .= $_SERVER['QUERY_STRING'];
}
header(sprintf("Location: %s", $insertGoTo));
}
?>
Этот скрипт должен добавлять несколько записей в БД... Или надо только одну с номерами articles через запятую?..
5. Lera - 06 Июня, 2007 - 09:06:34 - перейти к сообщению
Furax, ура!!! Получилось!!! Именно так и надо, чтобы несколько записей добавлялось сразу. Спасибо тебе еще раз!

Одна проблемка - почему-то все-таки нет второго артикля Однако
6. Furax - 08 Июня, 2007 - 02:45:06 - перейти к сообщению
Lera
Напиши, пожалуйста, весь код из первого скрипта. Если есть ссылки на другие файлы - кинь и эти файлы, лучше вложением. Только пароль mySQL не забудь заретушировать.
7. Lera - 08 Июня, 2007 - 04:53:10 - перейти к сообщению
Furax, я уже справилась. Написала вот так:

CODE:
<?php for ($i=0, $montages=mysql_query($query_montages, $bp); $row_montages=mysql_fetch_assoc($montages); $i++) { ?>


Не знаю правильно или нет, но зато работает, выводит весь список, ничего не пропускает Улыбка
8. Furax - 08 Июня, 2007 - 23:36:03 - перейти к сообщению
Lera
Почему бы и нет? Славненько...
9. Lera - 14 Июня, 2007 - 05:31:39 - перейти к сообщению
Furax, у меня снова затруднение возникло. Посмотри, пожалуйтса, как исправить.

Случайно обнаружила на этой же странице с чекбоксами, если нажимаешь кнопку "Купить" не выбрав ни одного чекбокса, сверху на странице выводится ошибка выполнения foreach. Вот этого:
CODE:
foreach ($_POST['article'] as $article)


Я сделала так:
CODE:
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
if ($article=="")
{
echo "Veillez choisir des montages en cochant les cases\n";
exit();
}
foreach ($_POST['article'] as $article)


Теперь выводится сообщение о том, что нужно сначала выбрать артикль, а потом уже нажимать "Купить", но это выглядит совсем некрасиво, и я не знаю как сделать возврат к форме и вообще ко всей странице.
10. Furax - 14 Июня, 2007 - 10:04:37 - перейти к сообщению
Lera
В самом начале файла со скриптом добавления записи напиши:
CODE:
<?php
if (!isSet($_GET['article']))
header('Location: адрес');
?>

Важно, чтобы перед этим скриптом не было ни пустой строки, не даже пробела. Куда будешь перенаправлять - на меленькую страничку с предупреждением и приглашением попробовать ещё раз или же просто обратно на страницу ввода - решать тебе. Можно сделать и как-нибудь так:
CODE:
<php
if (isSet($_GET['article']))
{
//Здесь наш скрипт добавления...
}
else
{
//Вывод предупреждения...
}

Наконец, можно перенаправлять первым способом на страницу с чекбоксами, но передавать дополнительно параметр GET, скажем, error=nooneselected. Тогда на странице с чекбоксами где-нибудь в начале добавляем что-нибудь вроде:
CODE:
<?php
if (isSet($_GET['error'] && ($_GET['error']=='nooneselected'))
{ ?>Ошибка: вы не выбрали статьи/книжки/альбома/товара (нужное подчеркнуть)! <?php } ?>

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.045]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33