PDO / mysql UPDATE查询没有做任何事情或显示错误

时间:2015-11-26 16:51:03

标签: php mysql pdo

从第49行开始的代码绝对没有任何作用。我试图显示PHP错误,使用try和catch PDO set属性等,这也没有显示错误。

当我使用mysql扩展程序进行连接时,代码在mysqli之前有效,但我目前正在将整个应用程序转换为PDO

    <?php 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
//mysqli_report(MYSQLI_REPORT_ALL);
error_reporting(E_ALL);
ini_set("display_errors", 1);

if(!isset($_SESSION['eid'])){ header("Location: index.php"); } else {

require('dbconn.php');
$sessionuser = $_SESSION['eid'];
$messageid = $_GET['id'];

try{
$db = new PDO($dsn, $db_user, $db_pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$sql = "SELECT * FROM messages WHERE id = :messageid"; 
$rs_result1 = $db->prepare($sql);
$rs_result1->bindParam(":messageid", $messageid);
$rs_result1->execute();
$result1 = $rs_result1->fetch(PDO::FETCH_ASSOC);
$senderid = $result1['eidfrom'];
$recid = $result1['eidto'];

$sql1 = "SELECT * FROM employees WHERE eid = :senderid";
$rs_result2 = $db->prepare($sql1);
$rs_result2->bindParam(":senderid", $senderid);
$rs_result2->execute();
$result2 = $rs_result2->fetch(PDO::FETCH_ASSOC);

$sql2 = "SELECT * FROM employees WHERE eid = :recid";
$rs_result3 = $db->prepare($sql2);
$rs_result3->bindParam(":recid", $recid);
$rs_result3->execute();
$result3 = $rs_result3->fetch(PDO::FETCH_ASSOC);


          echo "<table>";
          echo "<tr><td>To: </td> <td>".$result3['fname']." ".$result3['lname']."</td></tr>";
          echo "<tr><td>From: </td> <td>". $result2['fname'] ." ".$result2['lname']."</td></tr>";
          echo "<tr><td>Date: </td><td> ". date("l, jS F Y H:i:s", strtotime($result1['date']))."<br /> </td></tr>";
          echo "<tr><td>Subject: </td><td>".$result1['subject']."</td></tr>";
          echo "<tr><td colspan='2'><img src =\"images/newssplit.gif\"></td></tr>";
          echo "<tr><td>Message: </td><td>". $result1['body']." </td></tr>";
          echo "</table>";

          //line 49 below
          if($sessionuser == $senderid) { 
            $sql3 = "UPDATE `messages` SET `reads`='1' WHERE `id`= :messageid";
            $result4 = $db->prepare($sql3);
            $result4->bindParam(":messageid", $messageid);
            $result4->execute();

             } else {
                    $sql4 = "UPDATE `messages` SET `read`='1' WHERE `id`= :messageid";
                    $result5 = $db->prepare($sql4);
                    $result5->bindParam(":messageid", $messageid);
                    $result5->execute();
                    }

} catch (mysqli_sql_exception $e) { 
        throw $e; 
    }
}
?>

至少可以说我被卡住了!我在这里读了许多帖子,其中有相同问题的人,我也没有看到代码有什么问题。 我缺少什么?

编辑:到目前为止,我已经检查了模式,以确保我的字段实际存在,尝试使用query(),尝试使用标准变量而不是bindParam占位符,变量$ messageid肯定在该阶段有一个值,因为我替换之后测试打印$ sql3:带有$ messageid的messageid。我已经在zip ZIP中发布了一些相关文件并导出了架构。 Haven尚未找到解决方案,非常坚持这一点,因为inbox.php第42行的UPDATE查询工作正常。

EDIT2:上面的代码使用更安全的选择查询进行了更新,架构已使用正确的数据类型和索引进行了更新。但是现在第49行的内容仍然不会更新消息中的值,或者返回错误。

EDIT ::解决:

问题不是我的查询,而是我的if语句。我还没有完全测试语句和查询的功能。我正在做的是测试来自同一用户的消息上的查询。我没有准备好if语句的可能性(因为它发生的声明和查询组合起来一直用于普通用户1到用户2,反之亦然)。以下是我如何使用它。

if($sessionuser == $senderid && $sessionuser == $recid) { 

        $result4 = $db->prepare("UPDATE `messages` SET `read_s`='1', `read_`='1' WHERE `id`= :messageid");
        $result4->bindParam(":messageid", $messageid);
        $result4->execute();

         } elseif($sessionuser == $senderid) {

                $result5 = $db->prepare("UPDATE `messages` SET `read_s`='1' WHERE `id`= :messageid");
                $result5->bindParam(":messageid", $messageid);
                $result5->execute();
                } else {

                $result6 = $db->prepare("UPDATE `messages` SET `read_`='1' WHERE `id`= :messageid");
                $result6->bindParam(":messageid", $messageid);
                $result6->execute();
                }

在读取有关保留字的内容之后,我将列标题从读取和读取更改为强调。但后来也发现它实际上并不重要。谢谢大家的帮助!关于架构等我得到的其他注释和反馈帮助我学习了一些好的练习! TYTY

1 个答案:

答案 0 :(得分:2)

根据您在评论中提供的zip文件

模式

CREATE TABLE IF NOT EXISTS `employees` (
  `eid` int(11) NOT NULL AUTO_INCREMENT,
  `fname` varchar(50) NOT NULL,
  `lname` varchar(50) NOT NULL,
  `dob` varchar(50) NOT NULL,   -- why not date datatype?
  `sdate` varchar(50) NOT NULL, -- why not date datatype?
  `address1` text NOT NULL,
  `address2` text NOT NULL,
  `city` varchar(50) NOT NULL,
  `postcode` varchar(50) NOT NULL,
  `telephone` varchar(50) NOT NULL,
  `mobile` varchar(50) NOT NULL,
  `email` text NOT NULL,    -- why text?
  `password` varchar(50) NOT NULL,  -- I can help you solve this next
  `depid` int(11) NOT NULL,
  `userlevel` int(11) NOT NULL,
  `blocked` int(11) NOT NULL,
  PRIMARY KEY (`eid`),  -- makes sense
  UNIQUE KEY `eid` (`eid`)  -- why a duplicate key (as PK) ?  you already have it covered
) ENGINE=MyISAM;
truncate table employees;

insert employees(fname,lname,dob,sdate,address1,address2,city,postcode,telephone,mobile,email,password,depid,userlevel,blocked) values
('Frank','Smith','dob','sdate','addr1','addr2','c','p','t','m','e','p',1,2,0);
insert employees(fname,lname,dob,sdate,address1,address2,city,postcode,telephone,mobile,email,password,depid,userlevel,blocked) values
('Sally','Jacobs','dob','sdate','addr1','addr2','c','p','t','m','e','p',1,2,0);



CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `eidto` int(11) NOT NULL,
  `eidfrom` int(11) NOT NULL,
  `read` int(11) NOT NULL,
  `reads` int(11) NOT NULL,
  `inbox` int(11) NOT NULL,
  `sentbox` int(11) NOT NULL,
  `subject` text NOT NULL,  -- why a text datatype? was it gonna be huge?
  `body` text NOT NULL,
  `date` varchar(50) NOT NULL,  -- why this data type?
  PRIMARY KEY (`id`),       -- makes sense
  UNIQUE KEY `id` (`id`),   -- why this dupe?
  KEY `id_2` (`id`)         -- why?
) ENGINE=MyISAM;

insert messages(eidto,eidfrom,`read`,`reads`,inbox,sentbox,subject,body,`date`) values
(1,2,1,1,1,1,'subject','body','thedatething');

inbox.php

<?php 
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
//mysqli_report(MYSQLI_REPORT_ALL);
error_reporting(E_ALL);
ini_set("display_errors", 1);

session_start();
//$sessionuser = $_SESSION['eid'];
$sessionuser = 1;
require('dbconn.php');

    try {
        $db = new PDO($dsn, $db_user, $db_pass);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);   // line added
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);       // line added

        if (isset($_GET["page"])) { 
            $page  = $_GET["page"]; 
        } 
        else{ 
            $page=1; 
        }; 

        $start_from = ($page-1) * 10; 
        $sql = "SELECT * FROM messages WHERE eidto = $sessionuser AND inbox = 1 ORDER BY date DESC LIMIT $start_from, 10"; 
        echo $sql;
        $sql2 = "SELECT COUNT(*) FROM messages WHERE eidto = $sessionuser AND inbox = 1 ORDER BY date DESC LIMIT $start_from, 10"; 
        $rs_result = $db->query($sql);
        $count = $db->query($sql2)->fetchColumn();

        echo "<h3>Inbox</h3>";
        echo "<form action='".$PHP_SELF."' method='post'><table><tr><b><td>#</td><td>From</td><td>Subject</td></b></tr>";
        while ($row = $rs_result->fetch(PDO::FETCH_ASSOC)) { 
            $senderid = $row['eidfrom'];
            echo "<br>".$senderid;
            $messageid = $row['id'];
            $result2 = $db->query("SELECT * FROM employees WHERE eid = $senderid");
            $row2 = $result2->fetch(PDO::FETCH_ASSOC);
            if($row['read'] == 0) {
                echo "<tr> <td><input type='checkbox' name='checkbox[]' value='".$row['id']."' id='checkbox[]'></td>";
                echo "<td><b>".$row2['fname']." ".$row2['lname']."</b></td>";
                echo "<td><b><u><a href='usercp.php?action=messages&f=message&id=".$row['id']."'>".$row['subject']."</a></u></b></td></tr>";
            } else {
                echo "<tr> <td><input type='checkbox' name='checkbox[]' value='".$row['id']."' id='checkbox[]'></td>";
                echo "<td>".$row2['fname']." ".$row2['lname']."</td>";
                echo "<td><a href='usercp.php?action=messages&f=message&id=".$row['id']."'>".$row['subject']."</a></td></tr>";
            }
        }; 
        echo "<tr><td><input type='submit' id='delete' name='delete' value='Delete'></table></form>";

        if(isset($_POST['delete'])){
            for($i=0;$i<$count;$i++){
                $del_id = $_POST['checkbox'][$i];
                $sql = "UPDATE `messages` SET `inbox`='0' WHERE `id`='$del_id'";
                $result = $db->prepare($sql);
                $result->execute();
            }

            if($result){
                echo "<meta http-equiv=\"refresh\" content=\"0;URL=usercp.php?action=messages&f=inbox\">";
            }
        } 

        // NEED TO MODIFY CODE BELOW SO THAT PREVIOUS LINK DOESN'T LINK TO PAGE 0 WHEN ON PAGE 1
        // AND NEXT DISAPPEARS WHEN ON LAST PAGE WITH RECORDS
        $sql = "SELECT * FROM messages WHERE eidto = $sessionuser AND inbox = 1"; 
        $sql2 = "SELECT COUNT(*) FROM messages WHERE eidto = $sessionuser AND inbox = 1";
        $rs_result = $db->query($sql);
        $rows = $db->query($sql2)->fetchColumn();

        if($rows > 10) {
            $total_pages = ceil($rows / 10); 
            echo "<a href='usercp.php?action=messages&f=inbox&page=".($page-1)."'>Previous</a>";
            for ($i=1; $i<=$total_pages; $i++) { 
                        echo "<a href='usercp.php?action=messages&f=inbox&page=".$i."'>".$i."</a> "; 
            };  echo "<a href='usercp.php?action=messages&f=inbox&page=".($page+1)."'>Next</a>";
        } else { } 
    } catch (mysqli_sql_exception $e) { 
        throw $e; 
    }
?>

检查错误。您在 fetchColumn 上输了一个错误,错误报告告诉我。

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
mysqli_report(MYSQLI_REPORT_ALL);
error_reporting(E_ALL);
ini_set('display_errors', 1);

Op已经表示他正在将代码重新写入PDO。因此,

顺便说一句,从Fred's great PHP Answers

挖出的线和颜色以上

请注意,我添加了try/catch块和PDO连接异常属性以支持它。

以下是要清理的事项清单:

  • 由于网址缓存安全问题和尺寸限制,将您的GETS移至$ _POST。

  • 如果您还没有,请查看散列和password_verify。这是An Example我写的。

  • 清理数据类型和索引。您可以在架构中看到评论。

  • 转到上面提到的安全准备的陈述。

因此,对于此处给出的功能,我插入的假数据出现,删除工作。我相信你可以从这里拿走它。

修改

最佳做法是选择不是Reserved Words的列名。该列表中的那些旁边有(R)。在查询中对所有列名称使用反向标记可以防止在这方面查询失败。

至于你为什么我回复一些而不是其他人的问题。凌晨3点,那些在我的查询编辑器中显示为红色,而我却懒得不回复所有这些。