การแบ่งหน้าการค้นหาทำให้ฉันมีคำเตือน: การหารด้วยศูนย์

ฉันได้รับคำเตือนนี้ > คำเตือน: หารด้วยศูนย์ใน ‹ หากฉันพิมพ์บางอย่างที่ไม่มีอยู่ในฐานข้อมูล

หากฉันพิมพ์บางอย่างที่มีอยู่ ทุกอย่างทำงานได้ดี ฉันจะค้นหาหรือแก้ไขปัญหาไม่พบ

ด้านล่างนี้คือสคริปต์ที่ฉันใช้ในขณะนี้ ทักษะ php ของฉันไม่สมบูรณ์แบบแต่ฉันก็พยายามแล้ว

<?php 


$button = mysql_real_escape_string($_GET ['submit']);
$search = $str = $stt = mysql_real_escape_string(strip_tags($_GET ['search']));
$str = strtoupper($str);
$stt = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");

if(strlen($search)<=2) {

echo 'Nothing found for <b>'.strip_tags($str).'</b>. Please try something else ! ';

}else{

echo 'You searched for <b>'.$stt.'</b> ';


echo "";
include 'extern_/connectsearch.php';

$search_exploded = explode (" ", $search);

foreach($search_exploded as $search_each)
{
$x++;
if($x==1)
$construct .="title LIKE '%$search_each%'";
else
$construct .="AND title LIKE '%$search_each%'";
   }



$constructs ="SELECT * FROM table WHERE $construct";
$run = mysql_query($constructs);

$foundnum = mysql_num_rows($run);

if ($foundnum==0)

echo 'No results for <b>'.$search.'</b> ';

else
{ 


$per_page = 36;  
$id = (int)mysql_real_escape_string($_GET['page']);
$max_pages = ceil($foundnum / $per_page);
if(!$id)
$id=0; 


$p_num = $per_page*$id;  


if($id) 
    $p_num = ($id - 1) * $per_page;             //first item to display on this page
else
    $p_num = 0;

$getquery = mysql_query("SELECT * FROM `table` WHERE $construct ORDER BY date DESC  LIMIT $p_num, $per_page");




$title = $row ['title'];

$url = $row ['url'];


while($row = mysql_fetch_assoc($getquery))
{




echo '<div class="grid">


<a href="/th'. $row['url'] .'"  
id="'. $row['id'] .'" 
alt="'. $row['title'] .'" 
title="'. $row['title'] .'" 
target="_blank">

<h3 class="style">'. substr($row['title'], 0, 34).' ...</h3>

</a>



</div>
</div>
</div>
              ';


 }


 }
echo '<center>';


?>

 <!-- pagination -->

<?php

echo '<center>';


    $page = $id;
    $total_pages = $foundnum;
    $limit = $per_page;
    if ($page == 0) $page = 1;                  
    $prev = $page - 1;                          
    $next = $page + 1;                          
    $lastpage = ceil($total_pages/$limit);      
    $lpm1 = $lastpage - 1;  
    $adjacents = 5;     




    $pagination = "";
    if($lastpage > 1)
    {   
        $pagination .= "<div class=\"paginate\">";

        if ($page > 1) 
            $pagination.= "<a href=\"".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$prev\">Prev</a>";



        if ($lastpage < 7 + ($adjacents * 2))   
        {   
            for ($counter = 1; $counter <= $lastpage; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<a href='/th".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter' class='current'>$counter</a>";
                else
                    $pagination.= "<a href=\"".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter\">$counter</a>";                   
            }
        }
        elseif($lastpage > 5 + ($adjacents * 2))    
        {

            if($page < 1 + ($adjacents * 2))        
            {
                for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<a href='/th".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter' class='current'>$counter</a>";
                    else
                        $pagination.= "<a href=\"".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter\">$counter</a>";                   
                }

            }
            //in middle; hide some front and some back
            elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
            {

                for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<a href='/th".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter' class='current'>$counter</a>";
                    else
                        $pagination.= "<a href=\"".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter\">$counter</a>";                   
                }

            }

            else
            {

                for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
                {
                    if ($counter == $page)
                        $pagination.= "<a href='/th".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter' class='current'>$counter</a>";
                    else
                        $pagination.= "<a href=\"".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$counter\">$counter</a>";                   
                }
            }
        }


        if ($page < $counter - 1) 
            $pagination.= "<a href=\"".$_SERVER['PHP_SELF']."?search=$search&submit=search&page=$next\">Next</a>";

        $pagination.= "</div>\n";       
    }

    echo $pagination;

echo '</center>';
} 

?>

คำเตือน: หารด้วยศูนย์ใน home/search.php ออนไลน์ 348

บรรทัดที่ 348

$lastpage = ceil($total_pages/$จำกัด);

และอีกอย่างที่ฉันอยากรู้คือสคริปต์นี้ปลอดภัยเพียงพอหรือไม่?

ความช่วยเหลือใด ๆ ที่ชื่นชม ขอบคุณล่วงหน้า


person Tasos    schedule 05.10.2014    source แหล่งที่มา
comment
บรรทัด #348 อยู่ที่ไหน? มันบอกคุณอย่างชัดเจนว่าคุณกำลังพยายามทำบางอย่างเช่น - 5/0 ดังนั้น คุณต้องคำนึงถึงเมื่อมีค่า 0 ในส่วนที่เกี่ยวกับ if this script safe enough ดู - stackoverflow.com/questions/60174/   -  person Sean    schedule 06.10.2014
comment
โปรดแสดงการแบ่งหน้าเฉพาะในกรณีที่คุณพบผลลัพธ์ ;)   -  person ryrysz    schedule 06.10.2014
comment
@Sean ฉันไม่เข้าใจสิ่งที่คุณหมายถึง คุณช่วยยกตัวอย่างให้ฉันหน่อยได้ไหม   -  person Tasos    schedule 06.10.2014
comment
เห็นได้ชัดว่าปัญหาคือ $limit เท่ากับ 0 ฉันจะเริ่มต้นด้วย echo $limit; และดูว่าคุณจะได้อะไร...   -  person Mark Miller    schedule 06.10.2014
comment
@MarkM ฉันลองแล้ว echo $limit; แต่ยัง '.$จำกัด' อยู่ที่ไหนสักแห่งในหน้า แต่ฉันได้รับข้อผิดพลาดเดียวกัน   -  person Tasos    schedule 06.10.2014
comment
ตัวอย่าง -› $n=1;$d=0; echo $n/$d; // Gives Warning: Division by zero.   -  person Sean    schedule 06.10.2014
comment
ฉันคิดว่าปัญหาของคุณคือ $per_page = 36; อยู่ภายใน else ของ if ($foundnum==0) ดังนั้นเมื่อคุณใช้ใน $limit = $per_page; ดังนั้น $per_page; จะไม่ได้ถูกกำหนดไว้ และ $lastpage = ceil($total_pages/$limit); ทำให้ $limit เท่ากับ 0 โดยแจ้งเตือนคุณ ลองย้าย $per_page = 36; ไปด้านนอก if/else หรือเปลี่ยน $limit = $per_page; เป็น $limit = 36;   -  person Sean    schedule 06.10.2014
comment
@ฌอน ใช่ !!! คุณแค่แก้ปัญหาของฉันได้....ความผิดพลาดเล็กๆ น้อยๆ อาจทำให้เกิดปัญหาใหญ่ได้ในบางครั้ง... ขอบคุณ   -  person Tasos    schedule 06.10.2014
comment
ความคิดที่ดีขึ้น ตามที่ @ryrysz ชี้ให้เห็น ให้แสดงเฉพาะการนำทางการแบ่งหน้า หาก พบผลลัพธ์ อาจทำได้ง่ายเพียงแค่ย้ายวงเล็บปิด } ก่อน echo '<center> ไปยังจุดสิ้นสุดของไฟล์   -  person Sean    schedule 06.10.2014


คำตอบ (1)


ปัญหาของคุณคือโค้ดไม่ได้ตั้งค่า $per_page ในทุกกรณี หากคุณตรวจสอบโค้ด คุณจะเห็นว่าที่เดียวที่ตั้งค่าตัวแปรนี้คือเมื่อ:

if ($foundnum==0)

แต่โค้ดยังคงทำงานและเมื่อดำเนินการ

$limit = $per_page;
if ($page == 0) $page = 1;                  
$prev = $page - 1;                          
$next = $page + 1;                          
$lastpage = ceil($total_pages/$limit);  

ไม่ได้กำหนด var $per_limit และค่าของมันคือ null ดังนั้น เมื่อคุณทำการหาร $total_pages/$limit PHP จะแปลง null เป็น 0 และนั่นคือสาเหตุที่ทำให้คุณได้รับข้อผิดพลาดนี้เมื่อไม่มี ค่า DB จะถูกส่งกลับ

วิธีแก้ไขนั้นทำได้ง่ายเพียงแค่ตั้งค่า $per_page ในทุกกรณี

person Miguel    schedule 06.10.2014