Veri şeklinde görüntüleyemez

4 Cevap php

about my system the university complaint..stud or staff can use this system to complaint. first user fill the form complaint and submit after submit user can view the complaint.now the problem is the complaint can't display....

kullanıcı şikayeti (userCampus.php) için bu kodu:

?php  // ------------------------------------------------------PROCESS -------------------------- START. ?>
<?php

     $page_title='userCampus';


     if(isset($_POST['submit'])){

         if($_POST['secname']){
          //$sn=escape_data($_POST['secname']);
          $sn=$_POST['secname'];
         // echo '<br> sn is : ' . $sn;
         }else{
         $sn=FALSE;
         $message .='<p>You forgot to select section name!</p>';      
         }

         if($_POST['subject']){ 
          //$s=escape_data($_POST['subject']);
          $s=$_POST['subject'];
         }else{ 
         $s=FALSE;
         $message .='<p>you forgot to enter subject!</p>'; 
        }

         if($_POST['comment']){
         //$c=escape_data($_POST['comment']);
         $c=$_POST['comment'];
         }else{
         $c=FALSE;
         $message .='<p>you forgot to enter comment!</p>';     
         }

         }

         if($sn && $s && $c ){

             $userid = $_SESSION['username'];
             $groupid = $_SESSION['secname'];



             $query=" INSERT INTO campuscomplaint (secname, subject, comment, nameuser, groupid, userid)" . 
                    " VALUES (" . "'" . $sn . "','" . $s . "','" . $c . "','" . $nameuser . "','" . $groupid . "','" . $userid . "')";
             //echo 'query is : ' . $query . '<br>'; 



             include "connectioncomplaint.php";

             mysql_query($query);
             echo'<p><b></b></p>';
             include('done.php');
             exit();
         }


?>
<?php //------------------------------------------------ PROCESS ------------------------------------ end. ?>   




<form action="<?php echo$_SERVER['PHP_SELF'];?>" method="post">

görünüm için bu kodu şikayet-userView.php (diğer sayfa için kullanım):

<?php //======================================================================================================================= PROCESS DATA ======================================================= START. 
include "connectioncomplaint.php";
?>
<?php


$userid  = $_GET['userid'];
$secname = $_GET['secname'];
$subject = $_GET['subject'];
$comment = $_GET['comment'];

//echo 'test : ' . $subject;
//Tarik data dari sini 
$queryDetail =  " SELECT * FROM campuscomplaint " . 
               " WHERE subject = '" . $subject . "' AND comment = '" . $comment . "' ";
//echo 'QUERY DETAIL :' . $queryDetail . '<br>' ;

$resultDetail = mysql_query($queryDetail);
//echo 'RESULT DETAIL :' . $resultDetail + 0 . '<br>' ;

$detail = mysql_fetch_array($resultDetail);


//echo $detail . '<br>';
//echo 'detail subject is : ' . $detail['subject'] . '<br>';
//echo 'detail comment is : ' . $detail['comment'] . '<br>';
//echo $detail[$x] . '<br>';

?>

i php sıfır becoz u bütün .... bana yardımcı olabilir umuyoruz .......

4 Cevap

Biz kod kelepir her şeyi kontrol edebilirsiniz Bakalım:

Sağ satırdan sonra hata ayıklama kodu yapıştırın:

$detail = mysql_fetch_array($resultDetail); 

Hata ayıklama kodu:


echo '<pre>';
echo '$userid = '.$userid."\n";
echo '$secname = '.$secname."\n\n";
echo 'Query: '.$queryDetail."\n\n";
echo 'Query results:'."\n\n";
print_r($detail);
echo '</pre>';
die();

Yani açıkça nerede sorundur yapmak gerekir.

Eğer () Kesinlikle insanların web sitenize kötü şeyler yapmıyoruz yapmak çok önemlidir mysql_real_escape_string kullanmanız gerekir Ayrıca neden anlamak gerekir. En azından bu işlevini kullanmadan düz bir veritabanına (örneğin GET veya POST veri olarak) kullanıcı tarafından değiştirilebilir bir şey göndermek asla. Bu, aksi takdirde onları sorgu (size istemediğiniz bir şey yapıyor) değiştirmek için izin verecek karakterleri kaçar. Bu google "SQL Injection saldırısı" hakkında daha fazla bilgi için

benim deneyim bir şey. Lütfen sorgu ile yanlış bir şey varsa, sadece mysql üzerinde deneyin. sql sorgunuzu koştu ve easaly senin sorunun ne olduğunu görebilirsiniz böylece yerine değişkenlerin, bazı değerleri koydu.

Eğer secname önce $ işaretini unuttum ve sorguya gidiyor değişkenleri dezenfekte yok gibi görünüyor. Yani, bu şekilde yapmak deneyin:

<?php    
include "connectioncomplaint.php";    

$userid  = mysql_real_escape_string($_GET['userid']);
$secname = mysql_real_escape_string($_GET['secname']);

//Tarik data dari sini     
$queryDetail = "SELECT * FROM campuscomplaint " .     
               "WHERE userid = '$userid' AND secname = '$secname'";    

$resultDetail = mysql_query($queryDetail) or trigger_error(mysql_error()." in ".$queryDetail);
$detail = mysql_fetch_array($resultDetail);    
?> 

Bu sizin campuscomplaint tabloda bir birincil anahtarı kullanarak ve tanıtıcısı olarak çeşitli veri alanlarını kullanarak değil görünüyor.

Eğer veri yolunda takılı demek olduğundan, bunu aldığımızı nasıl bakmak gerekir:

$userid  = $_GET['userid'];
$secname = $_GET['secname'];
$subject = $_GET['subject'];
$comment = $_GET['comment'];

ve sonra SQL sorgusunda sizin NEREDE fıkra olarak bu kullanarak:

$queryDetail =  " SELECT * FROM campuscomplaint " . 
" WHERE subject = '" . $subject . "' AND comment = '" . $comment . "' ";

Biri için, bu SQL enjeksiyon için açıktır ve tek tırnak içeren herhangi bir konu ya da $ $ comment sorgu kıracak. Sen sorgu mysql_error() mysql_query() çağrısından sonra arayarak başarılı olmadığını görmek için kontrol edilmez.

Ayrıca GET sorgudan bu rekor "tanımlayıcı" alınırken olduğunuzu düşünün. Bunlar (çeşitli tarayıcılar için farklı) sınırlı bir uzunluğu var. Birinin comment veri 10 kilobayt, ancak tarayıcı yalnızca 1024 karakter göndermek ne olur? Veritabanı sorgu başarılı olsa bile açıklama alanlar maç asla, çünkü hiçbir veri dönecektir.

Kullanıcının sorgu dizesi (sadece örnek amaçlı) 100 karakterle sınırlı olduğunu varsayalım. Böyle bir şey görünüyor şikayetlerin bir listesini oluşturmak:

<a href="viewcomplaint.php?userid=7&secname=12&subject=This class sucks!!!&comment=Who hired this professor? He doesn't know anything!!!!">View complaint</a>

Şimdi linke tıkladığında, bu sunucuya gönderilecek budur, bu nedenle zaman bizim sorgu dizesi 32 karakterle sınırlıdır, hatırlıyorum:

GET http://www.example.com/viewcomplaint.php?userid=7&secname=12&subject=This class sucks!!!&comment=Who hired this professor? He doesn't know a

ve aşağıdaki "kimlik" ile bitireceğiz

$userid= 7;
$secname = 12;
$subject = "This class sucks!!!";
$comment = "Who hired this professor? He doesn't know a";

$comment kesildi nasıl fark. Bu veritabanında saklanan ne maç asla, bu yüzden alma sorgu başarısız olur. Ayrıca, içinde bir tek alıntı olduğunu fark (doesn't). Sorgu Verbatim içine $ Yorum takma şimdi, çünkü dengesiz tek tırnak bir SQL sözdizimi hatası neden olur.

Bu gibi, campuscomplaint tabloya bir auto_incrementing birincil anahtar alanını ekle:

ALTER TABLE campuscomplaint ADD id int unsigned not null auto_increment primary key;

ve sonra şikayetleriniz tek bir sayısına göre tespit edilebilir, ve bu gibi onları alabilirsiniz:

$id = (int)$_GET['id']; // force $id to be a number. better than just blindly using the value in a query
$query = "SELECT * FROM campuscomplaint WHERE id = $id;";
$result = mysql_query($query);

if (mysql_error()) {
     // did the query fail? Say why!
     die("MySQL query failed! Error cause: " . mysql_error());
}
etc....

(Şikayetleri kayıt insanlar uzun basamak sayıları yüzlerce veya binlerce içine kalkmak çok dosya sürece) bir sayısal tanımlayıcı kullanımı kolay, çok kısa bir sorgu dizesi devam edecektir.