PHP / Slim有效的MySQL查询准备好的语句可以单独工作,但是一起使用时会失败

时间:2019-04-20 21:19:04

标签: php mysql slim

我正在使用带有Php的Slim框架开发一个RESTApi,以将Android应用程序连接到MySQL数据库(现在通过Postman发送测试请求)。该应用程序是在我市进行现场音乐活动的歌曲请求应用程序-参加演出的每位艺术家都将其歌曲添加到该应用程序中,演出的参与者可以选择并请求一首歌曲,该歌曲将电子邮件与他们的艺术家发送给艺术家在队列中的位置。

我正在尝试插入一个名为setqueues(ShowID int,SongID int,ArtistID int,Position int)的表中,但是首先我必须查看给定的ShowID是否分配了任何歌曲。如果可以,我将返回的行数加1,并将其分配给名为$ pos的变量。否则$ pos =1。然后我尝试在表中插入新行,但得到了

  

在布尔值上调用成员函数bind_param()

每当我尝试执行此操作时。我的代码是:

index.php

$app->post('/songtoqueue', function(Request $request, Response $response){
    if(!haveEmptyParameters(array('show_id', 'song_id', 'artist_id'), $request, $response)){
        $request_data = $request->getParsedBody();
        $show_id = $request_data['show_id'];
        $song_id = $request_data['song_id'];
        $artist_id = $request_data['artist_id'];
        $db = new DbOperations;
        $result = $db->addSongToShow($show_id, $song_id, $artist_id);

        if($result == SHOW_SONG_ADDED){
            $message = array();
            $message['error'] = false;
            $message['message'] = 'Song added to Show successfully';
            $response->write(json_encode($message));
            return $response
                        ->withHeader('Content-type', 'application/json')
                        ->withStatus(201);
        }else if($result == SHOW_SONG_FAILURE){
            $message = array();
            $message['error'] = true;
            $message['message'] = 'Some error occurred while attempting to add Song to Show.';
            $response->write(json_encode($message));
            return $response
                        ->withHeader('Content-type', 'application/json')
                        ->withStatus(422);
        }
    }
    return $response
        ->withHeader('Content-type', 'application/json')
        ->withStatus(422);
});

DbOperations.php

  public function addSongToShow($show_id, $song_id, $artist_id){
      $stmt = $this->con->prepare("SELECT COUNT(*) FROM (SELECT * FROM setqueues WHERE ShowID = ?) as c");
      $stmt->bind_param("i", $show_id);
      $stmt->execute();
      $stmt->bind_result($count);
      $stmt->fetch();
      $pos = 0;
      if($count == 0){
        $pos = 1;
      }else{
        $pos = $count + 1;
      }
      $stmt = $this->con->prepare("INSERT INTO setqueues(ShowID, SongID, ArtistID, Position) VALUES (?,?,?,?)");
      $stmt->bind_param("iiii", $show_id, $song_id, $artist_id, $pos);
      if($stmt->execute()){
        return SHOW_SONG_ADDED;
      }
      return SHOW_SONG_FAILURE;

  }

DbConnect.php

<?php

  class DbConnect{
    private $con;

    function connect(){
      include_once dirname(__FILE__) . '/Constants.php';

      $this->con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

      if(mysqli_connect_errno()){
        echo "Failed to connect" . mysqli_connect_error();
        return null;
      }

      return $this->con;
    }
  }

我已经检查了查询在phpmyadmin中是否可以正常运行,并且如果我仅使用一个或另一个查询,可以使它们正常工作,但是任何时候我尝试同时执行我的两个代码都失败了,并且遇到了上面的错误,线是

  

$ stmt = $ this-> con-> prepare(“ INSERT INTO setqueues(ShowID,SongID,ArtistID,Position)VALUES(?,?,?,?)”);

这里已经有很多问题,解决方案是不正确的MySQL语句。但是,我确定这些查询是正确的,甚至尝试将自动生成的插入语句从phpmyadmin复制/粘贴到我的代码中。问题是同时使用上述两个查询。任何建议都将不胜感激

-更新- 通过启用该行的mysqli错误报告解决了该问题

  

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

在连接语句之前。这使我看到需要添加$ stmt-> close();。在两次查询之间,因为mysqli默认使用无缓冲查询

0 个答案:

没有答案