簡體   English   中英

PDO / mysql UPDATE查詢不執行任何操作或顯示錯誤

[英]PDO/mysql UPDATE query doesn't do anything or display errors

從第49行開始的代碼完全沒有執行任何操作。 我試圖顯示PHP錯誤,使用try和catch的PDO設置屬性等,這也沒有顯示錯誤。

當我使用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在該階段肯定有一個值,因為我測試了打印$用$ messageid替換:messageid之后的sql3。 我已經在zip ZIP中發布了一些相關文件和模式的導出。 尚未提出解決方案,對此非常棘手,因為inbox.php第42行的UPDATE查詢工作正常。

EDIT2:上面的代碼使用更安全的選擇查詢進行了更新,架構已使用正確的數據類型和索引進行了更新。 但是,第49行上的內容仍然不會更新消息中的值,或者返回錯誤。

編輯::解決:

問題不是我的查詢,而是我的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

基於您提供的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上有錯字,錯誤報告告訴我。

錯誤報告添加到文件頂部,這將有助於發現錯誤。

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

行動黨表示,他正在將自己的代碼重寫為PDO。 因此,

  • 您需要使用准備好的語句切換到PDO以進行參數傳遞,以防止受到SQL Injection攻擊。

順便說一句,上面的線條和顏色是Fred很棒的PHP Answers講的

請注意,我添加了try/catch塊和一個PDO連接異常屬性來支持它。

這是要清理的清單:

  • 由於網址緩存的安全性和大小限制,請將您的GETS移至$ _POST。

  • 如果還沒有,請研究一下hashing和password_verify。 這是我寫的一個例子

  • 清理數據類型和索引。 在您的架構中可以看到注釋。

  • 移至上述安全准備好的陳述中。

因此,對於此處給出的功能,我插入的偽數據出現,並且刪除有效。 我相信您可以從這里拿走它。

編輯

最佳做法是選擇非保留字的列名。 該列表中的旁邊有一個(R) 在查詢中對所有列名稱使用反引號可以防止查詢失敗。

至於您為什么我反駁某些而不是其他的問題。 凌晨3點,那些在我的查詢編輯器中顯示為紅色,而且我很懶惰,沒有回頭所有這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM