Logical Issue With Implode In MySQLi Statement
السلام عليكم و رحمة الله وبركاته ..
المشكلة: بعد إضافه الايتمز (ID) في سشن شوبنج كارت و عرض معلومات الايتمز بناءا على الID لكل أيتم .. استخدمت ROUND(SUM(itme_price),2)) s لعرض كل ايتم بسعره الكوميوليتف .. يعني اذا اضافه اليورز مرتين راح يطلع العدد 2 و السعر دبل السعر الاصلي .. هذا الكود استخراج المعلومات من الداتا بيس واتمنى حل للمشكلة.
$wherein = implode(',', $_SESSION['cart']);
include_once(dirname(__FILE__).'/include/connection.php');
$sql="SELECT * , ROUND(SUM(item_price),2) , COUNT(ID) FROM `products` WHERE `ID` IN ($wherein) GROUP BY `ID`";
$res=$mysqli->query($sql) or die($mysqli->error.__LINE__);
$rowsnum = $res->num_rows;
echo @$sql;
while( $row = mysqli_fetch_array($res,MYSQLI_ASSOC) ){
echo"
<tr>
<td>
<a href='#'>
<img src='img/detailsquare.jpg' alt='White Blouse Armani'>
</a>
</td>
<td><a href='#'>$row[item_name]</a>
</td>
<td><input type='number' value='".$row['COUNT(ID)']."' min='1' max='$row[item_stock]' id='quan' name='quan' class='form-control' /></td>";
echo"<td id='unitprice' name='unitprice'>".$row['ROUND(SUM(item_price),2)']."</td>";
echo"<td>$0.00</td>
<td>$0.00</td>
<td><a href='#'><i class='fa fa-trash-o'></i></a>
</td>
</tr>
";
}
بعد عمل var_dump للarray .. تظهر بشكل صحيح وهم IDs الايتمز الي اضافهم اليوزر في الشوبنج كارت!! .. صار لي يومين عالمشكلة هذي !! ..
مثل ما تلاحظون بعد عمل echo للstatement يظهر الIDs بشكل صحيح وترتيب صحيح!! ..
وشكرا مقدما
ساعد بالإجابة
"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."
الإجابات (6)
بعد مراجعة الكود الي انت كاتبه صحيح وعمله هو نفس المتوقع منه وخاصه انك تستعلم بناء على رقم ID
السبب ان الاستعلام راح يتحقق اذا كان ID كان موجود ضمن اللسته راح يسوي الإستعلام ويعطي نتيجة وحدة حتى لو تكرر وجوده باللسته
انا سويت جدول بسيط ونفس استعلامك شوف هنا الجدول
وهنا الاستعلام والنتيجه لاحظ كررت ١ اكثر من مره ولكن معناته ان وجد id يساوي ١ نفذ الاستعلام مو معناته انه نفذه كل مره يطابق الشرط وهذا عمل IN بالإستعلام
وهنا انا نفذت الاستعلام وغيرت الشرط لاسم المنتج ولاحظ انه حسب لي المجموع للمنتجين الي لهم نفس الاسم والسبب انه نفذ الاستعلام مرتين وجمعهم تحت اسم واحد
بالنسبه لك افضل حل هو حفظ عدد المنتجات بالجلسة مع اسم المنتج الي سلة التسوق بدل تحفظ المنتج اكثر من مرة احفظ معرفه ثم عدده مثلا
cart_product['id']
cart_product['id']['quantity']
لما يحدد المستخدم منتج وهو اصلا موجود بالسلة يزيد العدد فقط بدون مايحفظ جلسة جديدة وهو الافضل والارتب
او اعمل دالة تحسب لك التكرار لكل منتج وتحفظها بمتغيرات او جلسه مع اني ماانصح بهالطريقة
وبعدها لما تنفذ الإستعلام وتطبع النتيجه للمتصفح تنفذ العمليه الحسابيه علي الناتج تضرب عدد المنتج بسعره وتعرض العدد المحفوظ اسهل وانضف لك لازم تستخدم if هنا تتحقق ان من المنتج لضربه بالعدد الصح
انت تتعامل مع منتج مشتريات ومبيعات
نصائح مهمة:
- لاتثق ابدا بالمستخدم
- دائما نقح ونضف القيم المخزنه بالجلسات سواء عند تخزينها او استدعائها
- دائما نقح ونضف القيم المستخدمة بالاستعلامات
- قلل من عدد العمليات الي تنفذها قاعدة البيانات خليها بس تجلب لك البيانات او تخزنها وسوي المعالجة ب php قد ماتقدر
- استخدم prepared statement بالاستعلام لتلافي الثغرات sql injections
فيه حل ثاني وسريع وانا ماانصح فيه ولكن حبيت اشاركك الحل
احسب قيمة التكرار لكل عدد بالمصفوفة بمتغير جديد وعند عملية طباعة القيمة بالمتصفح اضربها بالقيمة المخزنة لكل منتج هنا شرح مبسط للعملية بواسطة PHP
<?php
$array = [1,2,1,1,1,3];
$quantity = array_count_values($array);
var_dump($quantity);
echo '<br>';
echo $quantity[1];
وهنا انا عدلت على مثالك ويارب يعمل الكود لان عندي بس الجزئية الي انت كتبتها بالسؤال فياريت تجربها وترد لي خبر مااقدر اجرب الكود عندي للاسف
$wherein = implode(',', $_SESSION['cart']);
$quantity = array_count_values($wherein);
include_once(dirname(__FILE__).'/include/connection.php');
$sql="SELECT * , ROUND(SUM(item_price),2) , COUNT(ID) FROM `products` WHERE `ID` IN ($wherein) GROUP BY `ID`";
$res=$mysqli->query($sql) or die($mysqli->error.__LINE__);
$rowsnum = $res->num_rows;
echo @$sql;
while( $row = mysqli_fetch_array($res,MYSQLI_ASSOC) ){
echo"
<tr>
<td>
<a href='#'>
<img src='img/detailsquare.jpg' alt='White Blouse Armani'>
</a>
</td>
<td><a href='#'>$row[item_name]</a>
</td>
<td><input type='number' value='". $quantity[$row['ID']] ."' min='1' max='$row[item_stock]' id='quan' name='quan' class='form-control' /></td>";
echo"<td id='unitprice' name='unitprice'>".$row['item_price'] * $quantity[$row['ID']]."</td>";
echo"<td>$0.00</td>
<td>$0.00</td>
<td><a href='#'><i class='fa fa-trash-o'></i></a>
</td>
</tr>
";
}
اتمنى اكون أفدتك يارب
فيه حل ثاني وسريع وانا ماانصح فيه ولكن حبيت اشاركك الحل
احسب قيمة التكرار لكل عدد بالمصفوفة بمتغير جديد وعند عملية طباعة القيمة بالمتصفح اضربها بالقيمة المخزنة لكل منتج هنا شرح مبسط للعملية بواسطة PHP
<?php $array = [1,2,1,1,1,3]; $quantity = array_count_values($array); var_dump($quantity); echo '<br>'; echo $quantity[1];
وهنا انا عدلت على مثالك ويارب يعمل الكود لان عندي بس الجزئية الي انت كتبتها بالسؤال فياريت تجربها وترد لي خبر مااقدر اجرب الكود عندي للاسف
$wherein = implode(',', $_SESSION['cart']); $quantity = array_count_values($wherein); include_once(dirname(__FILE__).'/include/connection.php'); $sql="SELECT * , ROUND(SUM(item_price),2) , COUNT(ID) FROM `products` WHERE `ID` IN ($wherein) GROUP BY `ID`"; $res=$mysqli->query($sql) or die($mysqli->error.__LINE__); $rowsnum = $res->num_rows; echo @$sql; while( $row = mysqli_fetch_array($res,MYSQLI_ASSOC) ){ echo" <tr> <td> <a href='#'> <img src='img/detailsquare.jpg' alt='White Blouse Armani'> </a> </td> <td><a href='#'>$row[item_name]</a> </td> <td><input type='number' value='". $row['COUNT(ID)'] * $quantity[$row['COUNT(ID)']] ."' min='1' max='$row[item_stock]' id='quan' name='quan' class='form-control' /></td>"; echo"<td id='unitprice' name='unitprice'>".$row['item_price'] * $quantity[$row['COUNT(ID)']]."</td>"; echo"<td>$0.00</td> <td>$0.00</td> <td><a href='#'><i class='fa fa-trash-o'></i></a> </td> </tr> "; }
اتمنى اكون أفدتك يارب
looks great i think
راح اجرب هذي الطريقة بإذن الله و ارد عليك خبر مباشرة بعد التجربة اليوم بعد صلاة المغرب.
وشكرا الف شكر للقائمين على هذا الصرح .. سعيد جدا لوجودكم.
looks great i think
راح اجرب هذي الطريقة بإذن الله و ارد عليك خبر مباشرة بعد التجربة اليوم بعد صلاة المغرب.
وشكرا الف شكر للقائمين على هذا الصرح .. سعيد جدا لوجودكم.
يعافيك ربي انا عدلت على ردي السابق وصححت الاكواد لتفادي حدوث خطأ عند حساب العدد الكلي لكل منتج والقيمة الكلية عند طباعة العدد الكلي لكل منتج حذفت
$row['COUNT(ID)']
وعند حساب مجموع السعر للمنتج استبدلت
$row['COUNT(ID)']
بـ
$row['ID']
لطباعة السعر الصحيح بناء على id لكل منتج
بصراحة الMethod الاول ماعرفت تطبيقة والثاني بعد التجربة .. اعتقد موجود مشكلة لوجيكال بعد لان الinput تبع الـQuantity يظهر فاضي.
<?php
session_start();
//session_destroy();
echo "<br><br>";
$wherein = implode(',', $_SESSION['cart']);
$quantity = array_count_values($wherein);
var_dump($_SESSION['cart']);
//echo implode(',', $_SESSION['cart']);
include_once(dirname(__FILE__).'/include/connection.php');
$sql="SELECT * , ROUND(SUM(item_price),2) , COUNT(ID) FROM `products` WHERE `ID` IN ($wherein) GROUP BY `ID`";
$res=$mysqli->query($sql) or die($mysqli->error.__LINE__);
$rowsnum = $res->num_rows;
echo @$sql;
echo"<form method='post'>
<h1>Shopping cart</h1>
<p class='text-muted'>You currently have <string id='numberofitems'>".sizeof($_SESSION['cart'])."</strong> item(s) in your cart.</p>
<div class='table-responsive'>
<table class='table'>
<thead>
<tr>
<th colspan='2'>Product</th>
<th>Quantity</th>
<th>Unit price</th>
<th>Discount</th>
<th colspan='2'>Total</th>
</tr>
</thead>
<tbody>";
while( $row = mysqli_fetch_array($res,MYSQLI_ASSOC) ){
echo"
<tr>
<td>
<a href='#'>
<img src='img/detailsquare.jpg' alt='White Blouse Armani'>
</a>
</td>
<td><a href='#'>$row[item_name]</a>
</td>
<td><input type='number' value='".$quantity[$row['ID']]."' min='1' max='$row[item_stock]' id='quan' name='quan' class='form-control' /></td>";
echo"<td id='unitprice' name='unitprice'>".$row['item_price'] * $quantity[$row['ID']]."</td>";
echo"<td>$0.00</td>
<td>$".$row['ROUND(SUM(item_price),2)']."</td>
<td><a href='#'><i class='fa fa-trash-o'></i></a>
</td>
</tr>
";
}
echo"
</tbody>
<tfoot>
<tr>
<th colspan='3'></th>
<th colspan='2'>Total:</th>
<th colspan='2'><p id='totalprice' name='totalprice'></p></th>
</tr>
</tfoot>
</table>
</div>
<!-- /.table-responsive -->
<div class='box-footer'>
<div class='pull-left'>
<a href='category.html' class='btn btn-default'><i class='fa fa-chevron-left'></i> Continue shopping</a>
</div>
<div class='pull-right'>
<button class='btn btn-default' id='updatetotal' class='btn btn-success'><i class='fa fa-refresh'></i> Update basket</button>
<button type='submit' class='btn btn-primary'>Proceed to checkout <i class='fa fa-chevron-right'></i>
</button>
</div>
</div>
</form>
";
?>
والنتيجة
اتاسف منك الخطأ هنا
$quantity = array_count_values($wherein);
والمفروض
$quantity = array_count_values($_SESSION['cart']);
لانه بتحسب القيم داخل المصفوفة والدالة implode حولت المصفوفه لنص وبين كل كلمة وكلمة فاصلة فما راح يحسبها لك بشكل صحيح
implode — Join array elements with a string
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !