Php / Slim допустимые операторы MySQL, подготовленные к запросу, работают отдельно, но не работают при совместном использовании - PullRequest
1 голос
/ 21 апреля 2019

Я разрабатываю 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 по умолчанию использует небуферизованные запросы

...