مشكلة في طباعة Super Global Variables ضمن Function
السلام عليكم و رحمة الله و بركاته
حالياً أعمل على برمجة CMS مفتوحة المصدر ومجانية واجهتني مشكلة في لوحة التحكم أقوم باستدعاء الصفحات كلها عن طريق function view_page الكود المصدري : function print_pages($page) { if($page && !$_POST['search']) { $page = Page::get_page($page); eval($page['page_fun']."();"); } }كما هو واضح تقوم باستدعاء function تمثل اسم الصفحة كما هي في قاعدة البيانات و التي يتم استحضارها من قبل كلاس Page الآن وداخل كل دالة من هذه الدوال عند محاولتي استدعاء مصفوفة من $_POST يتم عرض اسم المصفوفة فقط Array على أنها نص مثلاً إن أردت طباعة $_POST['page_id']يطبع بشكل طبيعي أما عند محاولة طباعة مصفوفة قادمة من <input type="checkbox" name="users_select[]" value="someValues" /></td> echo $_POSTيطبع لي Array ( [users_status] => [submit] => delete [users_select] => Array )لاحظ العنصر users_select قام بطباعة محتوياته على أنها نص وليس مصفوفة و عند طلب print_r($_POST); خارج الدالة يطبع Array ( [users_status] => [submit] => delete [users_select] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) ) بشكل صحيح في الحقيقة لم أستطع تحديد نوع المشكلة حتى أبحث عن حل لها .. أرجو مساعدتي في حل هذه المشكلة الغريبة تحياتي لكم .
7 إجابات
0 من 0 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا جرب ان تستخدم var_dump للكشف بدلا من print_r جربتها ... نفس المشكلة .. جرب ان تلغى اى شىء يتنفذ على المصفوفة .. الحماية كمثال .. جرب تلغيها وجرب تانى انت كنج !!!! ... هههههههههه .. لا داعلى لذلك .. نحن هنا لمساعدتك ملاحظة 1 : بدي ضل كل عمري عم استنى 5 دقائق بين كل تعليق و التاني ؟ 5 دقائق؟ انا اكتب دون فرق توقيت اعتقد .. لانك تمتلك اقل من عدد اجابات معين .. هذه الخاصية موضوعة منعا للاسبام .. بس اعتد انها راح تزول عنك قريب
اعتقد ان هذا الكواد الذى تقصده وهو يعمل كما تريده .. انا لا ارى اى خطا ... حمل الملف من المرفقات وجربه وحده على السيرفر المحلى
بواسطة: MacOS تعديل: MacOS 0 من 0 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا هذا عندما يكون الملف لوحده معلق في السماء ^_^... ههههههههههه اذن اكيد الخطا يتعلق بشىء ما
ما اقصده هو:
if($_POST) { foreach ($_POST['users_select'] as $value) { echo $value; //User::remove_user($value); } ?> <div class="success">All Selected users has been deleted successfully .. !!</div> <?php } بواسطة: Rody.Adel 0 من 0 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا شكرا على المحاولة و لكن .. الإكتئاب حل لا بد منه هههههههههه :(
هذا هو الكود الكامل للصفحة ..
<?php function print_users() { define('ADMIN_USER_GRID_NUM', 5); $users_order_by = $_GET['order_by']; $users_order = $_GET['order']; $users_status = $_GET['status']; $users_limit = $_GET['limit']; $page = $_GET['page']; if(empty($users_order_by)) { $users_order_by = "id"; } if(empty($users_order)) { $users_order = "ASC"; } if(empty($users_status)) { $users_status = "active"; } if(empty($users_limit)) { $users_limit = 0; } $condition = "WHERE `user_status` = '".$users_status."'"; $users = User::get_users($condition,"ORDER BY `user_".$users_order_by."` ".$users_order." ","LIMIT ".$users_limit.",".ADMIN_USER_GRID_NUM); ?> <script> function change_status() { var status = document.getElementById("users_status").value; window.location = "index.php?page=<?php echo $page; ?><?php if($users_order_by){ echo "&order_by=".$users_order_by;} ?><?php if($users_order){echo "&order=".$users_order;} ?>&status=" +status; } </script> <form method="post" name="grid_users"> <h3>Users</h3> <fieldset> <?php if($_POST) { print_r($_POST); for ($i=0; $i<count($_POST['users_select']); $i++) { if($_POST['users_select'][$i] != "") { //User::remove_user($_POST['users_select'][$i]); } } ?> <div class="success">All Selected users has been deleted successfully .. !!</div> <?php } ?> <select name="users_status" id="users_status" onchange="change_status();"> <option value="">---</option> <option value="active">Active</option> <option value="not_active">Not Active</option> <option value="blocked">Blocked</option> </select> <div style="float: right;"> <input type="submit" name="submit" value="delete" /> </div> <table width="100%" style="text-align: center; margin-top: 20px;"> <tr> <?php if($users_order == "ASC"){$users_order = "DESC";} ?> <th><a href="index.php?page=users&order_by=id&order=<?php echo $users_order; ?>">ID</a></th> <th><a href="index.php?page=users&order_by=name&order=<?php echo $users_order; ?>">Full Name</a></th> <th><a href="index.php?page=users&order_by=email&order=<?php echo $users_order; ?>">Email</a></th> <th><a href="index.php?page=users&order_by=gender&order=<?php echo $users_order; ?>">Gender</a></th> <th><a href="index.php?page=users&order_by=status&order=<?php echo $users_order; ?>">Active</a></th> <th><a href="index.php?page=users&order_by=register_date&order=<?php echo $users_order; ?>">Registered</a></th> <th width="100">Action</th> <th>select</th> </tr> <?php if(count($users)>0){ $counter = 0; foreach ($users as $user){ $counter += 1;?> <tr <?php if( ($counter % 2) != 0 ){echo 'class="odd"';} ?>> <td><?php echo $user['user_id']; ?></td> <td><a href="index.php?page=users&sub_page=control_users&action=view&user_id=<?php echo $user['user_id']; ?>"><?php echo htmlspecialchars($user['user_name']); ?></a></td> <td><?php echo $user['user_email']; ?></td> <td><?php if($user['user_gender'] == 1){echo "Male";}else{echo "Female";} ?></td> <td><?php echo $user['user_status']; ?></td> <td><?php echo $user['user_register_date']; ?></td> <td> <a href="index.php?page=users&sub_page=control_users&action=edit&user_id=<?php echo $user['user_id']; ?>"> <img src="style/icons/user_edit.png" title="Edit user"/></a><a href="index.php?page=users&sub_page=control_users&action=delete&user_id=<?php echo $user['user_id']; ?>"> <img src="style/icons/user_delete.png" title="Delete user"/></a></td> <td> <input type="checkbox" name="users_select[]" value="<?php echo $user['user_id']; ?>" /></td> </tr> <?php }} ?> </table> <div class="pager"> <?php if($users_limit){$limit = $users_limit;}else {$limit = 0;} $users_num = User::get_users_count($condition); for($i=0; $i<ceil(($users_num/ADMIN_USER_GRID_NUM)) ; $i++ ) {?> <a class="page" href="index.php?page=users&limit=<?php echo (ADMIN_USER_GRID_NUM*$i); ?><?php if($users_status){echo "&status=".$users_status;} ?>" ><?php echo $i+1; ?></a> <?php } ?> </div> </fieldset> </form> <?php } ?> بواسطة: Nasser 0 من 0 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا ما العيب فى هذا .. اعتقد انك استخدمت الطريقة المفضلة؟ ويمكنك استعمال الـforeach بدلا من الـfor لاستخراج القيم أختي الكريمة اقرأي السؤال أولاً .. هل تقصد الخطأ هنا؟ if($_POST['users_select'][$i] != "") { الخطأ هو هنا ..print_r($_POST);لا يقوم بطباعة المحتوى بشكل صحيح ..راجعي أول المقالة لتعرفي كيف تظهر النتائج .. class Security { public static function escape($string) { if (get_magic_quotes_gpc()) { $string = stripslashes($string);} return $string; } public static function get_filter($string) { $string = Security::escape($string); $string = str_ireplace(array("union","select"), array("union,","select,"), $string); // Prevent SQL $string = strip_tags($string); return $string; } public static function post_filter($string) { $string = Security::escape($string); $string = str_ireplace(array("alert","%","meta"), array("alert,","%,","meta,"), $string); return $string; } } # Secure The Application foreach ($_POST as $key => $value){ $_POST[$key] = Security::post_filter($value); } foreach ($_GET as $key => $value){ $_GET[$key] = Security::get_filter($value); } بواسطة: Nasser تعديل: Nasser 2 من 2 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا طريقة جيدة ... مجهود ممتاز
اعتقد ان وضع البوست بهذه الطريقة غير مفضله وعليك تمريريها على الدالة على الاقل للاسباب الامنية .. وانت تريد كل شىء قياسى .. لا يوجد شىء به المصفوفة بوست فى دالة ويسمى قياسى
مثال لما اقصده: لا يفضل استعمال هذه function check_login_password() { $login = $_GET['login']; $password = $_GET['password']; }ويفضل استعمال هذه: function check_login_password($login, $password) { } هذا سيجعل الدالة تعمل بطريقة مستقلة اى غير محددة بالـGET فقط ، فاستعمال السوبر جلوبال بطريقة مباشرة فى دالة يحدد استخدام هذه الدوال ويجعلها عقيمة وغير امنة بواسطة: MacOS تعديل: MacOS 1 من 1 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا شكرا لك على الرد يبدو أني سأنام اليوم مصاباً بكئابة :( هههه باذن الله مش هتنام كئيب ولا حاجة
اعتقد انك يمكنك استعمال هذه الطريقة
$class = new Class(); $res = $class->function($_POST['variable']);بدلا من هذه الطريقة class Class{ function function(){ $variable = $_POST['variable']; } } بواسطة: Rody.Adel 0 من 0 أشخاص وجدو هذه الاجابة مفيدة. هل وجدتها؟ نعم لا في الحقيقة يمكنني أن أنقل المتغيرات في $_GET على الشكلids=1,2,3,4ولكني أقوم ببرمجة CMS, هذا يعني ان كل شيء يجب أن يكون قياسي تماماً..و ال $_GET و ال $_POST تعمل بشكل ممتاز ولكن عند تمرير مصفوفة .. تحدث هذه المشكلة ...كما أني حاولتglobal $_POST;ولم يتغير شيء .. وما الفائدة من تغيير نمط الاستدعاء من Static Function إلى instance Function إن كان المقصود تغغير تمرير ال $_POST كبرامتر ..حاولت التالي :function print_users($post = $_POST) {ولكنه يرفض هذا البرامتر .. :( |
من المفضل عدم استعمال البوست او الجت داخل الدوال .. حاول الاستبدال بمتغيرات دالة اى تضع البوست كمتغير يطلب فى دالة وليست بوست مباشر
7 / أكتوبر / 2011 الساعة 22:27
ممكن توضح يا غالى لان دائما هناك خيار اخر
7 / أكتوبر / 2011 الساعة 22:31
اعتقد ان هذه افضل او اصح if($page && !isset($_POST['search'])) {
7 / أكتوبر / 2011 الساعة 23:15
هل من الممكن ان ارى الكود كاملا لكى نحاول معرفة الخطا ان وجد
7 / أكتوبر / 2011 الساعة 23:35