Как проверить наличие 2 условных операторов, где должны выполняться оба, при циклическом просмотре каждой строки в массиве базы данных?PHP / MySql - PullRequest
0 голосов
/ 08 мая 2019

Я сделаю все возможное, чтобы сформулировать проблему.

Я проверяю наличие дубликатов в операторе вставки, помещая запрос в массив и используя цикл While для проверки каждой строки в таблице базы данных. У меня работает логика, за исключением того, что она все еще дает мне ошибку, когда только одно условий выполняется в любой строке. То, что я ищу, это как вывести ошибку только тогда, когда оба встречаются для любой отдельной строки .

Пример: у исполнителя может быть несколько песен, но я не хочу, чтобы у них были дублированные песни. Между тем несколько исполнителей должны иметь возможность иметь песни с одинаковым названием. Однако я получаю сообщение об ошибке, даже если в любом ряду выполняется одно из условий, мешающих мне выполнить это.

Итак, как мне проверить оба условия, которые должны быть выполнены для одной строки, а не для нескольких строк.

Спасибо!

// Insert user input Music into the Database 
// Check for duplicates
public function insertMusic() {
   $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
            or die('Error connecting to DB');

   $song_title = mysqli_real_escape_string($dbc, trim($this->song_title));    
   $song_length = mysqli_real_escape_string($dbc, trim($this->song_length));  
   $song_album = mysqli_real_escape_string($dbc, trim($this->song_album));
   $song_artist = mysqli_real_escape_string($dbc, trim($this->song_artist));
   $album_art = mysqli_real_escape_string($dbc, trim($this->album_art));

   // Check database for duplicates
   $duplicate_query = "Select * from Music";
   $duplicate_results = mysqli_query($dbc, $duplicate_query)
           or die('Error querying DB');
   $isDuplicate = true;

   while ($row = mysqli_fetch_array($duplicate_results)) {
       // Something with these 2 conditions are the issue??
       if ( ($song_title != $row['SongTitle']) && ($song_artist != $row['SongArtist']) ) {
            $isDuplicate = false;
       } else {
            $isDuplicate = true;
            echo '<p class="error">Song is already in the Database!</p>';
            break;
       }
   }

   if ($isDuplicate === false) {
        $query = "INSERT INTO Music (id, dateAdded, SongTitle, SongLength, SongAlbum, SongArtist, AlbumArt)" .
                   "VALUES (0, NOW(), '$song_title', '$song_length', '$song_album', '$song_artist', '$album_art')";

        // echo $query;

        $result = mysqli_query($dbc, $query)
                 or die('Error querying DB 1');

        mysqli_close($dbc);

        echo '<p class="success">Success!</p>';
   }
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Как уже говорилось, нет необходимости перебирать весь набор записей таблицы. Гораздо эффективнее просто спросить у таблицы, существует ли значение, используя SELECT EXISTS(SELECT 1 FROM table WHERE criteria).

Я полагаю, что INSERT SET id = 0 может быть еще одной проблемой, с которой вы столкнулись. Я предполагаю, что столбец id является первичным ключом с автоматическим приращением и будет содержать ошибку повторяющегося ввода , если указано уже существующее значение id. Когда id опущен в вашем операторе INSERT, MySQL автоматически установит для столбца увеличенное значение id.

Я также добавил несколько __LINE__ записей в ваше сообщение об ошибке, чтобы помочь в отладке, однако я предлагаю вам инвестировать в использование Exceptions и обработку их и использование подготовленных операторов , чтобы предотвратить атаки SQL-инъекций.

$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
        or die('Error connecting to DB ' . __LINE__);

$song_title = trim($this->song_title);    
$song_artist = trim($this->song_artist);
$song_length = trim($this->song_length);
$song_album = trim($this->song_album);
$album_art = trim($this->album_art);

//determine if duplicate
$stmt = mysqli_prepare($dbc, 'SELECT EXISTS(SELECT 1 FROM Music 
WHERE SongTitle = ? AND SongArtist = ?)');
if (!$stmt) {
       die('An error occurred ' . __LINE__);
}
mysqli_stmt_bind_param($stmt, 'ss', $song_title, $song_artist);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $isDuplicate);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);
$stmt = null;

if (!$isDuplicate) {
    $stmt = mysqli_prepare($dbc, 
    'INSERT INTO Music (dateAdded, SongTitle, SongLength, SongAlbum, SongArtist, AlbumArt)
VALUES (NOW(), ?, ?, ?, ?, ?)');
    if (!$stmt) {
       die('An error occurred ' . __LINE__);
    }
    mysqli_stmt_bind_param($stmt, 'sssss', $song_title, $song_length, $song_album, $song_artist, $album_art);
    if (false === mysqli_stmt_execute($stmt)) {
       die('An error occurred ' . __LINE__);
    }
    mysqli_stmt_close($stmt);
    $stmt = null;
    echo '<p class="success">Success!</p>';
} else {
    echo '<p class="error">Song is already in the Database!</p>';
}
mysqli_close($dbc);
0 голосов
/ 08 мая 2019

Ваш код должен выглядеть так в конце (не проверено):

// Insert user input Music into the Database 
// Check for duplicates
public function insertMusic() {
   $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
            or die('Error connecting to DB');

   $song_title = mysqli_real_escape_string($dbc, trim($this->song_title));    
   $song_length = mysqli_real_escape_string($dbc, trim($this->song_length));  
   $song_album = mysqli_real_escape_string($dbc, trim($this->song_album));
   $song_artist = mysqli_real_escape_string($dbc, trim($this->song_artist));
   $album_art = mysqli_real_escape_string($dbc, trim($this->album_art));

   // Check database for duplicates
   $duplicate_query = "SELECT * FROM Music WHERE SongTitle = '$song_title' AND SongArtist = '$song_artist'";
   $duplicate_results = mysqli_query($dbc, $duplicate_query)
           or die('Error querying DB');
   $isDuplicate = false;

   if(mysqli_num_rows($duplicate_results) > 0) {
     $isDuplicate = true;
   }

   if ($isDuplicate === false) {
        $query = "INSERT INTO Music (id, dateAdded, SongTitle, SongLength, SongAlbum, SongArtist, AlbumArt)" .
                   "VALUES (0, NOW(), '$song_title', '$song_length', '$song_album', '$song_artist', '$album_art')";

        // echo $query;

        $result = mysqli_query($dbc, $query)
                 or die('Error querying DB 1');

        mysqli_close($dbc);

        echo '<p class="success">Success!</p>';
   }
}
...