0

I'm quite new to PHP and MYSQL.

I'm looking for the right way to write the code for a query on which I want to UPDATE a couple of values on a table, and then UPDATE another value on another table with an if statement.

Here is what I've tried:

public function updateSubmission($data){

            $this->db->query('UPDATE submissions S, requests R
                                SET S.submission_title = :submission_title, 
                                    S.submission_area = :submission_area, 
                                    S.submission_link = :submission_link,
                                    S.submission_citations = :submission_citations,
                                    S.submission_status = :submission_status,
                                    S.submission_updatedby = :submission_updatedby
                                WHERE S.submission_id = :submission_id;
                                UPDATE requests R 
                                SET R.request_status = IF(R.request_status = "review2" AND :submission_status = "cancelled", "submission" )
                                WHERE R.request_id = :submission_requestid;
                                ');           

            $this->db->bind(':submission_title', $data['submission_title']);
            $this->db->bind(':submission_area', $data['submission_area']);
            $this->db->bind(':submission_link', $data['submission_link']);
            $this->db->bind(':submission_citations', $data['submission_citations']);
            $this->db->bind(':submission_status', $data['submission_status']);
            $this->db->bind(':submission_updatedby', $_SESSION['user_id']); 
            $this->db->bind(':submission_id', $data['submission_id']);   
            $this->db->bind(':submission_requestid', $data['submission_requestid']);    

            if($this->db->execute()){                            
                return true;      
            } else {
                return false;
            }
        }

First UPDATE part works, but second UPDATE part doesn't make any changes. I thought using UPDATE twice in a single query is not working. So I've tried another way:

            $this->db->query('UPDATE submissions S, requests R
                                SET S.submission_title = :submission_title, 
                                    S.submission_area = :submission_area, 
                                    S.submission_link = :submission_link,
                                    S.submission_citations = :submission_citations,
                                    S.submission_status = :submission_status,
                                    S.submission_updatedby = :submission_updatedby
                                    R.request_status = IF(R.request_status = "review2" AND :submission_status = "cancelled", "submission")
                                WHERE S.submission_id = :submission_id AND R.request_id = :submission_requestid
                                ');

This also didn't work.

I basically want to update a table and depending on this update, if the new S.submission_status = "cancelled" and at the same time if the R.request_status is "review2", I want to change the R.request_status to "submission".

I have a solution of using two separate queries but I just wanted to know if it is possible on one query because I wanted to get only one feedback from the function and avoid the database writing error possibility of one of the queries.

I'm using a framework and below is the database.php

    <?php 

    /*
    PDO Database Class
    Connect to database
    Create prepared statements
    Bind values
    Return rows and results
    */

    class Database{
        private $host = DB_HOST;
        private $user = DB_USER;
        private $pass = DB_PASS;
        private $dbname = DB_NAME;
        //private $dbport = DB_PORT;

        private $dbh;
        private $stmt;
        private $error;

        public function __construct(){
            // Set DSN
            $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=utf8';
            $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            );

            // Create PDO instance
            try{
                $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            } catch(PDOException $e){
                $this->error = $e->getMessage();
                echo $this->error;
            }
        }

        // Prepare statement with query
        public function query($sql){
            $this->stmt = $this->dbh->prepare($sql);
        }

        // Bind values
        public function bind($param, $value, $type = null){
            if(is_null($type)){
                switch(true){
                    case is_int($value):
                        $type = PDO::PARAM_INT;
                        break;
                    case is_bool($value):
                        $type = PDO::PARAM_BOOL;
                        break;
                    case is_null($value):
                        $type = PDO::PARAM_NULL;
                        break;   
                    default:
                        $type = PDO::PARAM_STR;
                }
            }

        $this->stmt->bindValue($param, $value, $type);
        }

        // Execute the prepared statement
        public function execute(){
            return $this->stmt->execute();
        }

        // Get result set as array of objects
        public function resultSet(){
            $this->execute();
            return $this->stmt->fetchAll(PDO::FETCH_OBJ);
        }

        // Get single record as object
        public function single(){
            $this->execute();
            return $this->stmt->fetch(PDO::FETCH_OBJ); 
        }

        // Get row count
        public function rowCount(){
            return $this->stmt->rowCount();
        }

        // Returns the last inserted ID
        public function lastInsertId(){
            return $this->dbh->lastInsertId();
        }
    }

?>

Any help is appreciated. Thanks

Omer
  • 13
  • 5
  • I think to get an answer to your concrete question you have to answer a couple of questions first: Which database driver/layer are you using? Is it PDO? Why do you expect the database layer in conjunction with the database server, it's configuration and the configuration of the database connection to work with re-using parameters with a multi-query? Have you checked that at least the specification covers it or this feature is specifically supported? Please [edit] and add some more details/references. – hakre Dec 09 '22 at 08:52
  • 2
    Just run the query() function twice, with an UPDATE query on each one. Actually it should probably be prepare() rather than query(), since you're using parameters – ADyson Dec 09 '22 at 08:57
  • What @ADyson wrote and perhaps also compare https://stackoverflow.com/q/18511645/367456 for more context (I guess here that this is related to PDO) – hakre Dec 09 '22 at 09:01
  • `I wanted to get only one feedback from the function and avoid the database writing error possibility of one of the queries`...you can't do it in one. But if you wrap both queries in a SQL transaction then you can rollback all the updates if one of them fails. Here's an example: https://www.phptutorial.net/php-pdo/php-pdo-transaction/ – ADyson Dec 09 '22 at 11:05

0 Answers0