我正在使用带有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默认使用无缓冲查询