2017-05-03 133 views
-1

此刻,我在一張表格中顯示了所有註冊到健康中心的患者。我添加了一個刪除按鈕或刪除鏈接,將病人從桌面上移開。當我點擊刪除按鈕時,我收到一條錯誤消息,並且之前顯示的所有患者都消失了,現在「所有患者查看」頁面都會回顯「0結果」。
如果有人可以幫助我解決問題,以便我可以從表中移除病人,這將非常感激。試圖從表格中刪除一行

錯誤消息

警告:主():於E無法提取mysqli_result:\ WebProgrammingAssignment \視圖\ AllPatientsView.php在線路48上

最新登記患者模型

<?php 
require_once('DAO.php'); 

class RegisterPatientModel extends DAO 
{ 

    protected $target = "patient"; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function insertPatient($firstname, $lastname, $patstreet, $patcity, $patpostcode, $patphone, $doctorid, $dob) 
    { 
     $firstname = parent::escape($firstname); 
     $empnin = parent::escape($lastname); 
     $patstreet = parent::escape($patstreet); 
     $patcity = parent::escape($patcity); 
     $patpostcode = parent::escape($patpostcode); 
     $sql = "INSERT INTO {$this->target} (`firstname`, `lastname`, `patstreet`, `patcity`, `patpostcode`, `patphone`, `doctorid`, `dob`) VALUES ('{$firstname}', '{$lastname}', '{$patstreet}', '{$patcity}', '{$patpostcode}', '{$patphone}', '{$doctorid}', '{$dob}');"; 
     return parent::query($sql); 
    } 

     public function deletePatient($patientid) 
{ 
$sql = "DELETE 
    FROM {$this->target} 
    WHERE patientid='{$patientid}'"; 

return parent::query($sql); 
} 
    function getAllPatients() 
    { 
     $sql = "SELECT a.patientid, 
     concat(d.firstname, ' ', d.lastname) as fullname_doctor, 
     a.firstname, a.lastname, a.patstreet, a.patcity, a.patpostcode, a.patphone, a.dob 
     FROM patient as a 
     INNER JOIN doctor as d 
     on a.doctorid = d.doctorid;"; 
     return parent::query($sql); 
    } 
} 

?> 

更新所有的患者視圖

<html> 
<tr> 
<td colspan="5" align="center"> 

    <div id="boxalign2" class="boxalign2"> 
    <div class="inputwrap"> 


<br> 
<table id="customers" width="900" border="1" cellspacing="0" cellpadding="1"> 
    <tr align="center"> 
     <td bgcolor="#008000">Patient ID</td> 
     <td bgcolor="#008000">Doctor Name</td> 
     <td bgcolor="#008000">First Name</td> 
     <td bgcolor="#008000">Last Name</td> 
     <td bgcolor="#008000">Street</td> 
     <td bgcolor="#008000">City</td> 
     <td bgcolor="#008000">Post Code</td> 
     <td bgcolor="#008000">Telephone</td> 
     <td bgcolor="#008000">DOB</td>   
     </tr> 
    <?php 
$allpatients = $_SESSION['patients']; 
if ($allpatients->num_rows > 0) { 
    while ($row = $allpatients->fetch_assoc()) { 

     echo "<td>" . $row["patientid"] . "</td>"; 
     echo "<td>" . $row["fullname_doctor"] . "</td>"; 
     echo "<td>" . $row["firstname"] . "</td>"; 
     echo "<td>" . $row["lastname"] . "</td>"; 
     echo "<td>" . $row["patstreet"] . "</td>"; 
     echo "<td>" . $row["patcity"] . "</td>"; 
     echo "<td>" . $row["patpostcode"] . "</td>"; 
     echo "<td>" . $row["patphone"] . "</td>"; 
     echo "<td>" . $row["dob"] . "</td>"; 
     echo "<td><a href='../controllers/ViewAllPatientsController.php?patientid=" . $row['patientid'] . "'>Delete</a></td>"; 


     echo "</tr>"; 
    } 
} else { 
    echo "0 results."; 
} 

?> 

更新。查看病人控制器

<?php 

session_start(); 
require_once("../models/RegisterPatientModel.php"); 


$vapc = new RegisterPatientModel; 

if (isset($_GET['patientid'])) { 
$vapc->deletePatient($_GET['patientid']); 
} 
$allpatients = $vapc->getAllPatients(); 

require_once("../views/AllPatientsView.php"); 
+0

您希望爲患者刪除多少個數據行? 1? 2? 3? – Martin

+0

如果你的代碼是實時代碼,那麼它就是視圖,你有數據庫操作的風險,並且在把它們放入SQL之前不檢查這些值,你應該查找[Prepared Statements](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql -injection-in-php)並實際使用它們。 – Martin

+0

現在只是一行 – Matthew

回答

2

試試這個:

public function deletePatient($patientid) 
{ 
    $sql = "DELETE 
     FROM {$this->target} 
     WHERE patientid='{$patientid}'"; 

    echo $sql; 
    die(); 

    return parent::query($sql); 
} 

您將能夠弄清楚,如果是越來越創建的SQL查詢正確。

強制性警告:這不是一個查詢的好方法。

How can I prevent SQL injection in PHP?


更新一號

由於deletePatient()不點火,這個問題必須早源。

嘗試從DeletePatientController去除

require_once("../views/AllPatientsView.php"); 

。PHP


更新第二

您沒有使用$ _ POST,所以刪除

if (isset($_POST["Delete"])) {

並使用$_GET,而不是訪問patientid


更新第三

if (isset($_GET['patientid'])) { 
    $patientid->{$_GET['patientid']}(); 
} 

$rpms->deletePatient($patientid); 

應該

if (isset($_GET['patientid'])) { 
    $rpms->deletePatient($_GET['patientid']); 
} 

更新4

由於查詢是不是問題的根源,刪除調試語句:

public function deletePatient($patientid) 
{ 
    $sql = "DELETE 
     FROM {$this->target} 
     WHERE patientid='{$patientid}'"; 

    return parent::query($sql); 
} 

更新第五

由於刪除本身不是問題的一部分,你的下一步是調試代碼的其他部分。不需要

$allpatients = $vapc->getAllPatients(); 

$_SESSION['patients'] = $allpatients; 

... 

$allpatients = $_SESSION['patients']; 

$_SESSION有心計。刪除$_SESSION['patients'] = $allpatients;$allpatients = $_SESSION['patients'];

然後,更改

if ($allpatients->num_rows > 0) { 

var_dump($allpatients); 
die(); 
if ($allpatients->num_rows > 0) { 

,看看是否導致任何地方。你應該看到某種DAO對象或mysql_result(不管parent::query()返回)。


從.php文件快速提示

您可以刪除最後?>。這樣可以讓你從輸出中的尾隨換行符中的一些奇怪的標題錯誤中解脫出來。

+0

我正在使用mysql_real_escape_string。它包含在我的DAO頁面中,但我沒有將它添加到這裏。 – Matthew

+0

查詢語句不起作用。同樣的錯誤出現,它沒有迴應$ sql – Matthew

+0

@Matthew我希望你有[PHP錯誤打開](http://stackoverflow.com/questions/1053424/how-do-i-get-php-錯誤到顯示器)? – Martin