Я разрабатываю RESTApi с использованием Php с платформой Slim для подключения приложения 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 в мой код. Проблема заключается в использовании обоих вышеупомянутых запросов вместе. Любой совет с благодарностью
- UPDATE--
Это было решено включением mysqli сообщения об ошибках со строкой
mysqli_report (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
до моего заявления о соединении. Это позволило мне увидеть, что мне нужно добавить $ stmt-> close (); между запросами, потому что mysqli по умолчанию использует небуферизованные запросы