Logical Issue With Implode In MySQLi Statement

AbdullaScript • منذ 8 سنوات

السلام عليكم و رحمة الله وبركاته ..

 

المشكلة: بعد إضافه الايتمز (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 الايتمز الي اضافهم اليوزر في الشوبنج كارت!! .. صار لي يومين عالمشكلة هذي !! ..

 

Untitled.png

 

مثل ما تلاحظون بعد عمل echo للstatement يظهر الIDs بشكل صحيح وترتيب صحيح!! ..

وشكرا مقدما

كلمات دليلية:

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

الإجابات (6)

Ali Majrashi • منذ 8 سنوات

بعد مراجعة الكود الي انت كاتبه صحيح وعمله هو نفس المتوقع منه وخاصه انك تستعلم بناء على رقم ID 

السبب ان الاستعلام راح يتحقق اذا كان ID كان موجود ضمن اللسته راح يسوي الإستعلام ويعطي نتيجة وحدة حتى لو تكرر وجوده باللسته 

انا سويت جدول بسيط ونفس استعلامك شوف هنا الجدول 

1.thumb.png.d23147a9535d12544474f93a71e9

وهنا الاستعلام والنتيجه لاحظ كررت ١ اكثر من مره ولكن معناته ان وجد id يساوي ١ نفذ الاستعلام مو معناته انه نفذه كل مره يطابق الشرط وهذا عمل IN بالإستعلام

3.thumb.png.3d76e0678524c801f3f1a8e43713

وهنا انا نفذت الاستعلام وغيرت الشرط لاسم المنتج ولاحظ انه حسب لي المجموع للمنتجين الي لهم نفس الاسم والسبب انه نفذ الاستعلام مرتين وجمعهم تحت اسم واحد 

2.thumb.png.dab7a2a32b7206176a52187ba84d

بالنسبه لك افضل حل هو حفظ عدد المنتجات بالجلسة مع اسم المنتج الي سلة التسوق بدل تحفظ المنتج اكثر من مرة احفظ معرفه ثم عدده مثلا

cart_product['id']

cart_product['id']['quantity']

لما يحدد المستخدم منتج وهو اصلا موجود بالسلة يزيد العدد فقط بدون مايحفظ جلسة جديدة وهو الافضل والارتب

او اعمل دالة تحسب لك التكرار لكل منتج وتحفظها بمتغيرات او جلسه مع اني ماانصح بهالطريقة

وبعدها لما تنفذ الإستعلام وتطبع النتيجه للمتصفح تنفذ العمليه الحسابيه علي الناتج تضرب عدد المنتج بسعره وتعرض العدد المحفوظ اسهل وانضف لك لازم تستخدم if هنا تتحقق ان من المنتج لضربه بالعدد الصح

انت تتعامل مع منتج مشتريات ومبيعات 

نصائح مهمة:

  1. لاتثق ابدا بالمستخدم 
  2. دائما نقح ونضف القيم المخزنه بالجلسات سواء عند تخزينها او استدعائها
  3. دائما نقح ونضف القيم المستخدمة بالاستعلامات 
  4. قلل من عدد العمليات الي تنفذها قاعدة البيانات خليها بس تجلب لك البيانات او تخزنها وسوي المعالجة ب php قد ماتقدر
  5. استخدم prepared statement بالاستعلام لتلافي الثغرات sql injections 

 

Ali Majrashi • منذ 8 سنوات

فيه حل ثاني وسريع وانا ماانصح فيه ولكن حبيت اشاركك الحل 

احسب قيمة التكرار لكل عدد بالمصفوفة بمتغير جديد وعند عملية طباعة القيمة بالمتصفح اضربها بالقيمة المخزنة لكل منتج هنا شرح مبسط للعملية بواسطة 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>
                                        ";
                                    }

 

اتمنى اكون أفدتك يارب

AbdullaScript • منذ 8 سنوات

فيه حل ثاني وسريع وانا ماانصح فيه ولكن حبيت اشاركك الحل 

احسب قيمة التكرار لكل عدد بالمصفوفة بمتغير جديد وعند عملية طباعة القيمة بالمتصفح اضربها بالقيمة المخزنة لكل منتج هنا شرح مبسط للعملية بواسطة 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

 

راح اجرب هذي الطريقة بإذن الله و ارد عليك خبر مباشرة بعد التجربة اليوم بعد صلاة المغرب.

 

وشكرا الف شكر للقائمين على هذا الصرح .. سعيد جدا لوجودكم.

 

 

Ali Majrashi • منذ 8 سنوات

looks great i think

 

راح اجرب هذي الطريقة بإذن الله و ارد عليك خبر مباشرة بعد التجربة اليوم بعد صلاة المغرب.

 

وشكرا الف شكر للقائمين على هذا الصرح .. سعيد جدا لوجودكم.

 

 

يعافيك ربي انا عدلت على ردي السابق وصححت الاكواد لتفادي حدوث خطأ عند حساب العدد الكلي لكل منتج والقيمة الكلية عند طباعة العدد الكلي لكل منتج حذفت 

 

$row['COUNT(ID)']

وعند حساب مجموع السعر للمنتج استبدلت 

$row['COUNT(ID)']

بـ

$row['ID']

لطباعة السعر الصحيح بناء على id لكل منتج 

AbdullaScript • منذ 8 سنوات

بصراحة ال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>

                        ";
?>

 

والنتيجة

image.png

 

Ali Majrashi • منذ 8 سنوات

اتاسف منك الخطأ هنا

$quantity = array_count_values($wherein);

والمفروض

$quantity = array_count_values($_SESSION['cart']);

لانه بتحسب القيم داخل المصفوفة والدالة implode حولت المصفوفه لنص وبين كل كلمة وكلمة فاصلة فما راح يحسبها لك بشكل صحيح

implodeJoin array elements with a string

 

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !