Я пытаюсь заполнить 3 разные таблицы в моей базе данных.
распродажа таблица, которая имеет следующие строки:
Print_for_sale у которого есть:
Print_has_size_has_print_for_sale
Вот скриншот моей базы данных в MySQL Workbench, чтобы вы могли найти.
Я пытаюсь совершить «покупательское» действие.
Это моя разметка и код php:
printdetail.php
<?php$id= $_GET['print_id'];
$printdetails = getprintdetailsById($con, $id);
$line = mysql_fetch_assoc($printdetails);
$selectsize =" select * from size";
$result=mysql_query($selectsize);
?><div>
<img width="800px;"src="<?php echo $line['print_img']?>"/>
</div><div>
<span> <?php echo $line['print_title']?> </span>
<form action="addprints.php" method="post">
<ul>
<?php while ($line = mysql_fetch_assoc($result)) { ?>
<li> <input type="checkbox" name="sizes[]" value="<?php echo $line['size_id']?>">
<?php echo $line['size_name']." Price: ".$line['size_price']."€ "?>
</li>
<?php } ?>
<input type="submit" value="Add to Cart" >
</ul>
<input type="hidden" name="print_id" value="<?php echo $id; ?>" />
</form>
</div>
addprints.php
<?php
session_start();
$user_id = $_SESSION['user_id'];
print_r($_POST);
$id_print= $_POST['print_id'];
include('database.php');
$bought_sizes=$_POST['sizes'];
$number_of_bought_sizes= count($bought_sizes);//header('location:index.php?area=printstore');$sqlinsertsale = "insert into sale
(fk_sale_user,
fk_payment_id)
values(".$user_id.", 2)";
mysql_query($sqlinsertsale);for($i=0; $i< $number_of_bought_sizes; $i++){
$selectsize = "select *
from size";
$resultsize = mysql_query($selectsize);
while($linesize = mysql_fetch_assoc($resultsize))
{ $size_price = $linesize["size_price"]; }$selectsale = "select *
from sale";
$resultsale = mysql_query($selectsale);
while($linesale = mysql_fetch_assoc($resultsale))
{ $sale_id = $linesale["sale_id"]; }$sqlinsertprintforsale = "insert into print_for_sale
(fk_sale_id,
price_print_for_sale)
values(".$sale_id.", ".$size_price.")";
mysql_query($sqlinsertprintforsale);$selectprinthassize = "select *
from print_has_size";
$resultprinthassize = mysql_query($selectprinthassize);
while($lineprinthassize = mysql_fetch_assoc($resultprinthassize))
{ $print_has_size_id = $lineprinthassize["print_has_size_id"]; }$selectprintforsale = "select *
from print_for_sale";
$resultprintforsale = mysql_query($selectprintforsale);
while($lineprintforsale = mysql_fetch_assoc($resultprintforsale))
{ $print_for_sale_id = $lineprintforsale["print_for_sale_id"]; }$sqlinserthashas = "insert into print_has_size_has_print_for_sale
(fk_print_has_size_id,
fk_print_for_sale_id)
values(".$print_has_size_id.", ".$print_for_sale_id.")";
mysql_query($sqlinserthashas);}
?>
Я очень новичок в php и mysql, поэтому извините, если это глупый или плохой вопрос. Я не могу понять, что я делаю не так …
Стол Print_for_sale обновляет правильный идентификатор продажи (fk_sale_id), однако price_print_for_sale всегда одинаков, независимо от того, какую печать я выбираю. Это всегда 150, когда иногда это должно быть 65 или 25.
(Цена на печать определяется в размер Таблица. Пока что у меня 3 разных размера, поэтому разные цены.)
Стол Print_has_size_has_print_for_sale обновляет правильный идентификатор print_for_sale, но fk_print_has_size_id всегда имеет номер 12 (последний из этого списка) и не имеет ничего общего с моим выбором в форме. Я верю, что это то, что заставляет цену выходить из строя. Если это всегда одна и та же комбинация отпечатков и размера (print_has_size), то она всегда будет иметь одинаковую цену … Почему это происходит?
Может кто-нибудь, пожалуйста, помогите мне?
Вот несколько скриншотов phpmyadmin:
Редактировать: это функция, которую я использовал:
<?php
function getprintdetailsById($con, $print_id){
$question = "select * from print where print_id=".$print_id;
$result = mysql_query($question, $con);
return $result;
}
?>
Это много информации .. Я думаю, мы можем начать отладку. Давайте начнем с ваших циклов. Внутри вашего цикла, первая строка select * from size
, это должно вернуть массив, затем вы перебираете этот массив с помощью цикла while, но вы назначаете их только одной переменной. Это перезапишет результат данных последней итерации. Это то, что вы хотите? … продолжение следует.
Вы не хотите, чтобы это было перезаписано … так что вам нужно сделать, чтобы цикл while назначил его массиву, например так:
while ($linesize = mysql_fetch_assoc($resultsize)) {
$size_price[] = $linesize["size_price"];
}
Итак, когда у вас есть $size_price[]
со всеми желаемыми размерами мы идем дальше .. теперь ваш код работает select * from sale
где вы хотите все sale_ids
от. Так же, как и выше, назначьте его массиву, мы скажем $sale_ids[]
Теперь вы пытаетесь запустить запрос, который вставляет данные в print_for_sale
таблицы, но данные поступают из двух разных массивов, которые вы создали выше … это не будет работать, и если это так, вам нужно будет придумать сумасшедшие циклы и итерации, как вы уже пробовали.
Чтобы это исправить, сначала нужно посмотреть на свои таблицы, назначить им уникальные идентификаторы и связать их по индексам. После того, как вы это сделаете, вам нужно использовать JOIN
Команда SQL на ваши запросы, чтобы собрать сопоставленные данные.
Я бы тоже посмотрел на разделение вашего кода. это поможет вам использовать его повторно. Вы должны заглянуть в рамки MVC. Вы когда-нибудь слышали о Codeigniter? его очень легко выучить и мощный для приложений.
Надеюсь это поможет.
Ваш код может использовать работу, но я думаю, что ваша проблема — неуместная скобка в конце. Так должно быть:
while($lineprinthassize = mysql_fetch_assoc($resultprinthassize))
{
$print_has_size_id = $lineprinthassize["print_has_size_id"];
$selectprintforsale = "select *
from print_for_sale";
$resultprintforsale = mysql_query($selectprintforsale);
while($lineprintforsale = mysql_fetch_assoc($resultprintforsale))
{
$print_for_sale_id = $lineprintforsale["print_for_sale_id"];
$sqlinserthashas = "insert into print_has_size_has_print_for_sale
(fk_print_has_size_id,
fk_print_for_sale_id)
values(".$print_has_size_id.", ".$print_for_sale_id.")";
mysql_query($sqlinserthashas);
}
}
Код замены должен быть в цикле. В исходном коде вы прошли через все значения, заканчивая последним, а затем использовали его.