PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ارور xampp برای تابع header()



<?php?>
April 17th, 2016, 18:58
من همچین کدی رو نوشتم :


<!DOCTYPE html><html lan="fa"><?php try{ $dns="mysql:host=localhost;dbname=site;charset=utf 8;"; $connect=new PDO($dns,'root','');}catch(PDOException $error){ echo 'connection error';}include 'function.php';/* read db*/$result=$connect->query("SELECT * FROM `signup`");?> <head> <meta charset="utf-8"> <title>php</title> <!--STYLE--> <link rel="stylesheet/less" type="text/css" href="template/style/style.less"> <script type="text/javascript" src="template/javascript/less.min.js"></script> <!--METATAG--> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta http-equiv="Content-Language" content="Fa"> <meta name="description" content=""> <meta name="keywords" content=""> <meta name="DC.Subject" lang="fa-ir" content=""> <meta name="robots" content="index,follow"> <meta name="copyright" content=""> <!--END--> </head> <body> <main> <form class="right" action="<?php htmlspecialchars($_SERVER["PHP_SELF"]) ?>" method="post"> <table class="table1"> <tr> <td>نام</td> <td><input type="text" name="name" id="name"></td> </tr> <tr> <td>نام خانوادگي</td> <td><input type="text" name="family"></td> </tr> <tr> <td>ايميل</td> <td><input type="text" name="email" class="email"></td> </tr> <tr> <td>جنسيت</td> <td><select name="***"><option>مرد</option><option>زن</option></select></td> </tr> <tr> <td>نام کاربري</td> <td><input type="text" name="username" class="username"></td> </tr> <tr> <td>کلمه عبور</td> <td><input type="text" name="password" class="password"></td> </tr> <tr> <td>تکرار کلمه عبور</td> <td><input type="text" name="repeatpassword" class="repeatpassword"></td> </tr> <tr> <td>&nbsp;</td> <td><input type="submit" value="ثبت" class="submit" name="submit"></td> </tr> </table> </form> <div class="error pname"><img alt="error" src="template/icon/error.png"><span></span></div> <div class="error pfamily"><img alt="error" src="template/icon/error.png"><span></span></div> <div class="error pemail"><img alt="error" src="template/icon/error.png"><span></span></div> <div class="error p***"><img alt="error" src="template/icon/error.png"><span></span></div> <div class="error pusername"><img alt="error" src="template/icon/error.png"><span></span></div> <div class="error ppassword"><img alt="error" src="template/icon/error.png"><span></span></div> <div class="error prepeatpassword"><img alt="error" src="template/icon/error.png"><span></span></div> </main> <!-- --> <section> <table class="table2"> <thead> <td>نام</td> <td>نام خانوادگي</td> <td>ايميل</td> <td>جنسيت</td> <td>نام کاربري</td> <td>پسورد</td> <td>مديريت</td> </thead> <tbody> <?php while($rows=$result->fetch(PDO::FETCH_ASSOC)){ ?> <tr> <td><?php echo $rows['name']; ?></td> <td><?php echo $rows['family']; ?></td> <td><?php echo $rows['email']; ?></td> <td><?php echo $rows['***']; ?></td> <td><?php echo $rows['username']; ?></td> <td><?php echo $rows['password']; ?></td> <td> <a href="?id=<?php echo $rows['id']; ?>" onclick="return confirm('آيا از حذف اطلاعات اطمينان داريد ؟')"><img alt="delete" src="template/icon/delete.png"></a> <a href="edit.php?id=<?php echo $rows['id']; ?>"><img alt="delete" src="template/icon/edit.png"></a> </td> </tr> <?php }?> <!-- --> </tbody> </table> <a href="?deleteall" onclick="return confirm('آيا تمام اطلاعات جدول حذف شود ؟')"><button type="button">حذف تمام اطلاعات جدول</button></a> </section> </body><?php /* insert */if($_SERVER["REQUEST_METHOD"]=="POST"){ if(isset($_POST['name']) && isset($_POST['family']) && isset($_POST['email']) && isset($_POST['***']) && isset($_POST['username']) && isset($_POST['password']) && isset($_POST['repeatpassword']) && isset($_POST['submit'])){ $index=array( 'name'=>input($_POST['name']), 'family'=>input($_POST['family']), 'email'=>input($_POST['email']), '***'=>input($_POST['***']), 'username'=>input($_POST['username']), 'password'=>input($_POST['password']), 'repeatpassword'=>input($_POST['repeatpassword']), ); $a=$b=$c=$d=$e=$f=$g=0; /* validation name */ if(empty($index['name'])){ echo "<script>$('.pname').css({'display':'block'});$('. pname span').text('لطفا نام خود را پر کنيد !');</script>"; } else if(!preg_match('/^[a-zA-Z\x{0600}-\x{06EF}]{3,50}$/u',$index['name'])){ echo "<script>$('.pname').css({'display':'block'});$('. pname span').text('کارکتر هاي مجاز : a-z + حروف فارسي + حداقل 3 کارکتر !');</script>"; } else{ $a=1; } /* validation family */ if(empty($index['family'])){ echo "<script>$('.pfamily').css({'display':'block'});$( '.pfamily span').text('لطفا نام خانوادگي خود را پر کنيد !');</script>"; } else if(!preg_match('/^[a-zA-Z\x{0600}-\x{06EF}]{3,50}$/u',$index['name'])){ echo "<script>$('.pfamily').css({'display':'block'});$( '.pfamily span').text('کارکتر هاي مجاز : a-z + حروف فارسي + حداقل 3 کارکتر !');</script>"; } else{ $b=1; } /* validation email */ $result_email=$connect->query("SELECT `email` FROM `signup` WHERE `email`='".$index['email']."'"); $rowcount_email=$result_email->rowCount(); if(empty($index['email'])){ echo "<script>$('.pemail').css({'display':'block'});$(' .pemail span').text('لطفا ايميل خود را پر کنيد !');</script>"; } else if(!filter_var($index['email'],FILTER_VALIDATE_EMAIL)){ echo "<script>$('.pemail').css({'display':'block'});$(' .pemail span').text('ايميل نا معتبر !');</script>"; } else if($rowcount_email>0){ echo "<script>$('.pemail').css({'display':'block'});$(' .pemail span').text('ايميل شما قبلا ثبت شده است !');</script>"; } else{ $c=1; } /* validation *** */ if(empty($index['***'])){ echo "<script>$('.p***').css({'display':'block'});$('.p *** span').text('لطفا جنسيت خود را پر کنيد !');</script>"; } else if(!preg_match('/^[\x{0600}-\x{06EF}]{2,4}$/u',$index['***'])){ $d=0; } else{ $d=1; } /* validation username */ $result_username=$connect->query("SELECT `username` FROM `signup` WHERE `username`='".$index['username']."'"); $rowcount=$result_username->rowCount(); if(empty($index['username'])){ echo "<script>$('.pusername').css({'display':'block'}); $('.pusername span').text('لطفا نام کاربري خود را پر کنيد !');</script>"; } else if(!preg_match('/^[a-zA-Z0-9_@.]{3,50}$/i',$index['username'])){ echo "<script>$('.pusername').css({'display':'block'}); $('.pusername span').text('نام کاربري نا معتبر !');</script>"; } else if($rowcount>0){ echo "<script>$('.pusername').css({'display':'block'}); $('.pusername span').text('نام کاربري شما قبلا ثبت شده است !');</script>"; } else{ $e=1; } /* validation password */ if(empty($index['password'])){ echo "<script>$('.ppassword').css({'display':'block'}); $('.ppassword span').text('لطفا رمز عبور خود را پر کنيد !');</script>"; } else if(!preg_match('/^[a-zA-Z0-9_@.]{8,50}$/i',$index['password'])){ echo "<script>$('.ppassword').css({'display':'block'}); $('.ppassword span').text('رمز عبور نا معتبر !');</script>"; } else{ $f=1; } /* validation repeatpassword */ if(empty($index['repeatpassword'])){ echo "<script>$('.prepeatpassword').css({'display':'blo ck'});$('.prepeatpassword span').text('لطفا تکرار رمز عبور خود را پر کنيد !');</script>"; } else if(!preg_match('/^[a-zA-Z0-9_@.]{8,50}$/i',$index['password'])){ echo "<script>$('.prepeatpassword').css({'display':'blo ck'});$('.prepeatpassword span').text('نکرار رمز عبور نا معتبر !');</script>"; } else if($index['password']!==$index['repeatpassword']){ echo "<script>$('.prepeatpassword').css({'display':'blo ck'});$('.prepeatpassword span').text('رمز عبور با تکرار آن همخواني ندارد !');</script>"; } else{ $g=1; } if($a==1 && $b==1 && $c==1 && $d==1 && $e==1 && $f==1 && $g==1){ $connect->query("INSERT INTO `signup`(`name`,`family`,`email`,`***`,`username`, `password`,`repeatpassword`) VALUES('".$index['name']."','".$index['family']."','".$index['email']."', '".$index['***']."','".$index['username']."' ,'".$index['password']."' ,'".$index['repeatpassword']."')"); header('location: index.php'); } }}/* update *//* delete */if(isset($_GET['id'])){ $check_id=$connect->query("SELECT `id` FROM `signup` WHERE `id`='".$_GET['id']."'"); $check_id_count=$check_id->rowCount(); if($check_id_count==1){ $connect->query("DELETE FROM `signup` WHERE `id`='".$_GET['id']."' "); header('location: index.php'); } else{ echo "<script>alert('ip not found')</script>"; exit(); } }if(isset($_GET['deleteall'])){ $deleteall=$connect->query("DELETE FROM `signup`"); if($deleteall){ header("location: index.php"); }}?></html>



یک فرم عضویت ساختم - قصدم این بود که بعد از اینکه کاربر دکمه submit رو فشار داد اطلاعات بعد از ***** شدن برای ثبت به دیتابیس ارسال بشن و بعدش تابع header رو اجرا کنه تا صفحه رفرش بشه و header خالی بشه . همچنین یک جدول کنار فرم عضویت ساختم که اطلاعات رو از دیتابیس fetch میکنه و به من نمایش میده .

همه چیز درست کار میکنه . اما مشکل اینجاست که بعد از اینکه 2 تا رکورد از طریق فرمی که ساختم ثبت میکنم , برای سومین رکوردی که میخوام ثبت کنم این ارور رو میده :
Warning: Cannot modify header information - headers already sent by (output started at D:\xampp\htdocs\www\pt\index.php:105) in D:\xampp\htdocs\www\pt\index.php on line 214
اطلاعات ثبت میشه تو دیتابیس ولی مشکلش با تابع header هست .
من از نرم افزار شبیه ساز xampp استفاده میکنم .

تشکر

T.Toosi
April 17th, 2016, 19:05
هیدر باید قبل از نمایش یا خروجی هر content ـی قرار بگیرد.

rezaonline.net
April 17th, 2016, 19:13
فایلتو کامل بذار اینجا تا اصلاحش کنم براتون
http://paste.ofcode.org/

<?php?>
April 17th, 2016, 19:41
فایلتو کامل بذار اینجا تا اصلاحش کنم براتون
http://paste.ofcode.org/

http://paste.ofcode.org/qBaxXwTR4S28hkQF2NbKey
ممنون اقا رضا

- - - Updated - - -


هیدر باید قبل از نمایش یا خروجی هر content ـی قرار بگیرد.

منظورتون اینه که دستورات insert و update , delete در php باید قبل از fetch کردن اطلاعات از دیتابیس قرار بگیره؟

من اگر کد های بخش insert رو به قبل از تگ <head> انتقال بدم دیگه نمیتونم از طریق php اجزای صفحه رو با jquery کنترل کنم .( مثلا اگر فلان فیلد خالی بود , تو بیا و یک ارور زیبا رو با jquery نمایش بده)

rezaonline.net
April 18th, 2016, 01:05
http://paste.ofcode.org/c3xJYpMSZ2uzrYci4VdjR6
من تا یه حدودی اصلاح کردم
اما چند نکته خدمت شما
کدهایتون sql injection داره سعی کنید از متد prepare کلاس pdo استفاده کنید و داده ها رو به اینصورت وارد کنید
csrf رو رعایت نکردید برای حذف مقادیر :)
حذف مقادیر در سایت شما به این شکل است
مثلا حذف مقادیر شناسه 1 بصورت
examle.ir/index.php?id=1 هست درسته ؟

خب فرض کنید من توی یاهویی تلگرامی چیزی هستم و با شما درارتباطم و میدونم شما الان توی سایتتون لاگین هستید :)

میام یه صفحه html میسازم و این کدها رو توش میذارم


<img src='http://examle.ir/index.php?id=1'>
<img src='http://examle.ir/index.php?id=2'>
<img src='http://examle.ir/index.php?id=3'>
<img src='http://examle.ir/index.php?id=4'>
<img src='http://examle.ir/index.php?id=5'>

و یه جا میذارم
و به شما میگم بیا این سایت منو ببین :)
شما میایید توی سایت من ، و اون آدرسها بعنوان عکس لود میشه و چون توی سایت خودتون لاگین هستید پس باعث حذف رکوردهای 1 تا 5 میشه
این یکی از سادترین روش برای سو استفاده از csrf هست

همچنین داده هاتون رو هم escape نکردید از لحاظ پاکسازی و این خودش باعث باگ xss میشه


<td><?php echo $rows['name']; ?></td>

سعی کنید از توابع strip_tags و htmlspecialchars استفاده کنید

اگر تازه دارید با پی اچ پی کار میکنید و این مسائل کمی براتون گنگ و سخت هست نادیده بگیرد و به کارتون ادامه بدید تا کمی تجربه کسب کنید فقط مواظب باشید سایتتون رو در معرض عموم نذارید
انشاالله موفق باشید

<?php?>
April 18th, 2016, 15:31
اقا رضا بازم این ارورو هنوز برای ثبت بیشتراز 2 رکورد میده . اسکریپت رو اپلود کردم اگه بتونید ببینید چشه و تست کنید ممنون میشم . ( تغییرات شما رو هم اعمال کردم روش )

/**/

یک چیز دیگه : اینکه من دستورات insert - delete - update رو در انتهای صفحه درج میکنم تا بتونم با jquery قشنگتر صفجه و اررور هارو کنترل کنم , کار خوبیه به نظرتون؟
شما تو کد نویسی در کدوم محل برای درج کد های insert و .... فضت میزارید .
ممنون از شما30966

sazsaz
April 18th, 2016, 17:32
این تگ را بالای تمام تگ هات قرار بده
<?php ob_start();?>

<?php?>
April 18th, 2016, 21:38
این تگ را بالای تمام تگ هات قرار بده
<?php ob_start();?>

این تابع چه میکنه ؟
ممنون

<?php?>
April 19th, 2016, 12:55
اقا رضا مشکل حل شد : فقط تو طریق کد نویسی شما یه چنتا سوال برام پیش اومده :

+ چرا تو تابعی که برای insert ساختدید از out$ استفاده کردید ؟ چه نیازی بود؟ ایا مشکل امنیتی رو رفع میکنه؟
+ چرا برای مدیریت خطا ها تو تابع insert , متغییر out رو به این شکل مقدار دهی کردید؟( منظورم (=.) هست )


$out .="<script>$('.pname').css({'display':'block'});$('.pname span').text('لطفا نام خود را پر کنيد !');</script>";


و اینکه کد شمارو که اجرا کردم مشکل header حل شد فقط مشکل نمایش خطا ها توسط jquery موند که خطا ها در صورت پر نکردن فیلد توسط کاربر نمایش داده نمیشن ؟ ( فایل jquery رو هرجای صفحه فراخوانی کردم ولی خطاها بازم نمایش داده نشدن )

ممنون

miladtnt
April 19th, 2016, 19:17
طبق گفته های خود سایت php ، تابع header باید قبل از هرگونه کد html ارسال بشه ! ولی من خودم سایت دارم و اونو بعد از html گذاشتم کار میکنه ! بهتون توصیه میکنم ورژن های مختلف php
5.4
5.5
5.6
رو امتحان کنین ببینین تو کودوم این مشکل رو نداره

درضمن اگه خواستید از دست تابع header راحت شید میتونین از کد جاوا اسکریپت window.location استفاده کنین

rezaonline.net
April 19th, 2016, 19:23
اقا رضا مشکل حل شد : فقط تو طریق کد نویسی شما یه چنتا سوال برام پیش اومده :
سلام الحمدلله


+ چرا تو تابعی که برای insert ساختدید از out$ استفاده کردید ؟ چه نیازی بود؟ ایا مشکل امنیتی رو رفع میکنه؟
هر تابع باید یه خروجی داشته باشه ، خب یه متغییر بعنوان out در نظر گرفتیم که در آخر return کنیم و در پایین در کدهای html نشونش بدیم محتواشو


+ چرا برای مدیریت خطا ها تو تابع insert , متغییر out رو به این شکل مقدار دهی کردید؟( منظورم (=.) هست )



$out .= 'str';

با این یکی هست



$out = $out . 'str';



فقط مشکل نمایش خطا ها توسط jquery موند که خطا ها در صورت پر نکردن فیلد توسط کاربر نمایش داده نمیشن ؟ ( فایل jquery رو هرجای صفحه فراخوانی کردم ولی خطاها بازم نمایش داده نشدن )

ممنون
با افزونه فایرباگ مرورگر فایرفاکس چک کنید اوضاع رو