لديك حساب بالفعل؟ دخول
دخول  سجل الأن 
مشكلة في طباعة 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 / أكتوبر / 2011 الساعة 22:7 اخر نشاط: 8 / أكتوبر / 2011 الساعة 1:8 مشكلة Array $_POSt global variables

من المفضل عدم استعمال البوست او الجت داخل الدوال .. حاول الاستبدال بمتغيرات دالة اى تضع البوست كمتغير يطلب فى دالة وليست بوست مباشر
7 / أكتوبر / 2011 الساعة 22:27

ممكن توضح يا غالى لان دائما هناك خيار اخر
7 / أكتوبر / 2011 الساعة 22:31

اعتقد ان هذه افضل او اصح if($page && !isset($_POST['search'])) {
7 / أكتوبر / 2011 الساعة 23:15

هل من الممكن ان ارى الكود كاملا لكى نحاول معرفة الخطا ان وجد
7 / أكتوبر / 2011 الساعة 23:35

7 إجابات

بواسطة: Nasser
منذ: 8 / أكتوبر / 2011 الساعة 0:42

تعديل: MacOS
منذ: 8 / أكتوبر / 2011 الساعة 0:44

جرب ان تستخدم var_dump للكشف بدلا من print_r
8 / أكتوبر / 2011 الساعة 0:45

جربتها ... نفس المشكلة ..
array(3) { ["users_status"]=> string(0) "" ["submit"]=> string(6) "delete" ["users_select"]=> string(5) "Array" }

يعتبر المصفوفة string مكونة من 5 محارف Array ....
8 / أكتوبر / 2011 الساعة 0:48

جرب ان تلغى اى شىء يتنفذ على المصفوفة .. الحماية كمثال .. جرب تلغيها وجرب تانى
8 / أكتوبر / 2011 الساعة 0:50

انت كنج !!!! ...
انحلت المشكلة ..
بدها زلغوطة يا شباب :D
المشكلة كانت بالحماية .. ^_^ ..
لانه كان معتبرها مصفوفة على انها نص و عم يسوي عليها فلترة ..
حل المشكلة هو عمل recursive function تفحص اذا مصفوفة أو نص و تعالج الموضوع ^_^ ..
شكرا الك أخي...
اذا تحب ارسلك الكود المصدري للمشروع كاملاً ..
من دواع سروري ..
8 / أكتوبر / 2011 الساعة 0:52

هههههههههه .. لا داعلى لذلك .. نحن هنا لمساعدتك
8 / أكتوبر / 2011 الساعة 0:57

ملاحظة 1 : بدي ضل كل عمري عم استنى 5 دقائق بين كل تعليق و التاني ؟
ملاحظة 2 : مافي داعي للإكتئاب اليوم ^_^ .. خليها لغير مشكلة ^_^ ..
8 / أكتوبر / 2011 الساعة 0:59

5 دقائق؟ انا اكتب دون فرق توقيت اعتقد .. لانك تمتلك اقل من عدد اجابات معين .. هذه الخاصية موضوعة منعا للاسبام .. بس اعتد انها راح تزول عنك قريب
8 / أكتوبر / 2011 الساعة 1:3

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

بواسطة: MacOS
منذ: 8 / أكتوبر / 2011 الساعة 0:18

تعديل: MacOS
منذ: 8 / أكتوبر / 2011 الساعة 0:21

هذا عندما يكون الملف لوحده معلق في السماء ^_^...
و لكن المشكلة في البرمجية .. سوف أرفق صورة توضخ المشكلة
8 / أكتوبر / 2011 الساعة 0:28

ههههههههههه اذن اكيد الخطا يتعلق بشىء ما
8 / أكتوبر / 2011 الساعة 0:39

ما اقصده هو:
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
منذ: 8 / أكتوبر / 2011 الساعة 0:0

شكرا على المحاولة و لكن ..
حظأ أوفر في المرة القادمة ^_^ ..
لم تنجح .. :(
8 / أكتوبر / 2011 الساعة 0:11

الإكتئاب حل لا بد منه هههههههههه :(
8 / أكتوبر / 2011 الساعة 0:18

هذا هو الكود الكامل للصفحة ..

<?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
منذ: 7 / أكتوبر / 2011 الساعة 23:38

ما العيب فى هذا .. اعتقد انك استخدمت الطريقة المفضلة؟ ويمكنك استعمال الـforeach بدلا من الـfor لاستخراج القيم
7 / أكتوبر / 2011 الساعة 23:44

أختي الكريمة اقرأي السؤال أولاً ..
المشكلة في طباعة مصفوفة ضمن $_POST
و ليس في طباعة نتيجة استعلام ..
7 / أكتوبر / 2011 الساعة 23:46

هل تقصد الخطأ هنا؟ if($_POST['users_select'][$i] != "") {
7 / أكتوبر / 2011 الساعة 23:50

الخطأ هو هنا ..print_r($_POST);لا يقوم بطباعة المحتوى بشكل صحيح ..راجعي أول المقالة لتعرفي كيف تظهر النتائج ..
7 / أكتوبر / 2011 الساعة 23:55

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
منذ: 7 / أكتوبر / 2011 الساعة 23:19

تعديل: Nasser
منذ: 7 / أكتوبر / 2011 الساعة 23:20

طريقة جيدة ... مجهود ممتاز
7 / أكتوبر / 2011 الساعة 23:30

اعتقد ان وضع البوست بهذه الطريقة غير مفضله وعليك تمريريها على الدالة على الاقل للاسباب الامنية .. وانت تريد كل شىء قياسى .. لا يوجد شىء به المصفوفة بوست فى دالة ويسمى قياسى

مثال لما اقصده:
لا يفضل استعمال هذه
function check_login_password()
{
    $login = $_GET['login'];
    $password = $_GET['password'];
}
ويفضل استعمال هذه:
function check_login_password($login, $password)
{

}

هذا سيجعل الدالة تعمل بطريقة مستقلة اى غير محددة بالـGET فقط ، فاستعمال السوبر جلوبال بطريقة مباشرة فى دالة يحدد استخدام هذه الدوال ويجعلها عقيمة وغير امنة

بواسطة: MacOS
منذ: 7 / أكتوبر / 2011 الساعة 23:6

تعديل: MacOS
منذ: 7 / أكتوبر / 2011 الساعة 23:9

شكرا لك على الرد
بداية
موضوع الأمان عليك أن تنساه تماماً لأني قمت ببرمجة سطربن خفيفين
وكلاس سكيورتي جميل, سأضعه في رد منفصل .

بالنسبة لهذه الدوال فهي ليست دوال فعلية, لأن مهمتها هي عرض المحتوى فقط .
بدلاً من وضع كل ملف منفصل
طريقة بسيطة تمرير اسم الصفحة برامتر ثم استدعائها عن طريق eval

الدوال النظامية موجودة في ملفات الكلاسات وليس هنا
هذا يمكن تسميته module للوحة.

و مع اعتبار أن هذه الطريقة غير محببة ..
أين الخطأ في الموضوع ؟ لماذا لا يعمل بشكل سليم ؟
7 / أكتوبر / 2011 الساعة 23:16

يبدو أني سأنام اليوم مصاباً بكئابة :(
7 / أكتوبر / 2011 الساعة 23:35

هههه باذن الله مش هتنام كئيب ولا حاجة
7 / أكتوبر / 2011 الساعة 23:40

اعتقد انك يمكنك استعمال هذه الطريقة
$class = new Class();
$res = $class->function($_POST['variable']);
بدلا من هذه الطريقة
class Class{
     function function(){
         $variable = $_POST['variable'];
     }
}

بواسطة: Rody.Adel
منذ: 7 / أكتوبر / 2011 الساعة 22:38

في الحقيقة يمكنني أن أنقل المتغيرات في $_GET على الشكلids=1,2,3,4ولكني أقوم ببرمجة CMS, هذا يعني ان كل شيء يجب أن يكون قياسي تماماً..و ال $_GET و ال $_POST تعمل بشكل ممتاز ولكن عند تمرير مصفوفة .. تحدث هذه المشكلة ...كما أني حاولتglobal $_POST;ولم يتغير شيء ..
7 / أكتوبر / 2011 الساعة 22:38

وما الفائدة من تغيير نمط الاستدعاء من Static Function إلى instance Function إن كان المقصود تغغير تمرير ال $_POST كبرامتر ..حاولت التالي :function print_users($post = $_POST) {ولكنه يرفض هذا البرامتر .. :(
7 / أكتوبر / 2011 الساعة 22:42

أنشر اجابتك

xهل تريد الاجابة عن هذا السؤال؟ من فضلك سجل دخول او اشترك لتتمكن من الاجابة