2017-05-03 67 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