Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Cancellazione di query da un database sql

    C'è questo pezzo di codice di un libro che non mi convince ma che funziona ed è giusto:


    Codice PHP:
    if (isset($_POST['action']) and $_POST['action'] == 'Delete')
    {
      include 
    $_SERVER['DOCUMENT_ROOT'] . '/LIBRO/chapter7/includes/db.inc.php';

      
    // Get jokes belonging to author
      
    try
      {
        
    $sql 'SELECT id FROM joke WHERE authorid = :id';
        
    $s $pdo->prepare($sql);
        
    $s->bindValue(':id'$_POST['id']);
        
    $s->execute();
      }
      catch (
    PDOException $e)
      {
        
    $error 'Error getting list of jokes to delete.';
        include 
    'error.html.php';
        exit();
      }

      
    $result $s->fetchAll();

      
    // Delete joke category entries
      
    try
      {
        
    $sql 'DELETE FROM jokecategory WHERE jokeid = :id';
        
    $s $pdo->prepare($sql);
        
    // For each joke
        
    foreach ($result as $row)
        {
          
    $jokeId $row['id'];
          
    $s->bindValue(':id'$jokeId);
          
    $s->execute();
        }
      }
      catch (
    PDOException $e)
      {
        
    $error 'Error deleting category entries for joke.';
        include 
    'error.html.php';
        exit();
      }

      
    // Delete jokes belonging to author
      
    try
      {
        
    $sql 'DELETE FROM joke WHERE authorid = :id';
        
    $s $pdo->prepare($sql);
        
    $s->bindValue(':id'$_POST['id']);
        
    $s->execute();
      }
      catch (
    PDOException $e)
      {
        
    $error 'Error deleting jokes for author.';
        include 
    'error.html.php';
        exit();
      }

      
    // Delete the author
      
    try
      {
        
    $sql 'DELETE FROM author WHERE id = :id';
        
    $s $pdo->prepare($sql);
        
    $s->bindValue(':id'$_POST['id']);
        
    $s->execute();
      }
      catch (
    PDOException $e)
      {
        
    $error 'Error deleting author.';
        include 
    'error.html.php';
        exit();
      }

      
    header('Location: .');
      exit();



    Non mi è chiaro perché cancellando i record dalla tabella jokecategory si usa un ciclo for mentre per le altre no. Anche la tabella joke ha più record da cancellare in un solo colpo...
    Più pratica in futuro...

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    Forse perché in quella con il foreach hai un id per ogni joke, nell'altra devi cancellare tutto per un determinato autore

  3. #3
    Quote Originariamente inviata da clasku Visualizza il messaggio
    Forse perché in quella con il foreach hai un id per ogni joke, nell'altra devi cancellare tutto per un determinato autore
    Non credo perché in quella con il foreach ho diversi id per ogni joke perché ogni joke può appartenere a più categorie. jokecategory, per capirci mette in relazione i joke e le category e individua a quale categoria appartiene ogni joke.

    Ecco qui il codice sql:

    codice:
    CREATE TABLE joke (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        joketext TEXT,
        jokedate DATE NOT NULL,
        authorid INT
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    CREATE TABLE author (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255),
        email VARCHAR(255)
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    CREATE TABLE category (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255)
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    CREATE TABLE jokecategory (
        jokeid INT NOT NULL,
        categoryid INT NOT NULL,
        PRIMARY KEY (jokeid, categoryid)
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
    
    # Sample data
    # We specify the IDs so they are known when we add related entries
    
    INSERT INTO author (id, name, email) VALUES
    (1, 'Kevin Yank', 'thatguy@kevinyank.com'),
    (2, 'Joan Smith', 'joan@example.com');
    
    INSERT INTO joke (id, joketext, jokedate, authorid) VALUES
    (1, 'Why did the chicken cross the road? To get to the other side!', '2012-04-01', 1),
    (2, 'Knock-knock! Who\'s there? Boo! "Boo" who? Don\'t cry; it\'s only a joke!', '2012-04-01', 1),
    (3, 'A man walks into a bar. "Ouch."', '2012-04-01', 2),
    (4, 'How many lawyers does it take to screw in a lightbulb? I can\'t say: I might be sued!', '2012-04-01', 2);
    
    INSERT INTO category (id, name) VALUES
    (1, 'Knock-knock'),
    (2, 'Cross the road'),
    (3, 'Lawyers'),
    (4, 'Walk the bar');
    
    INSERT INTO jokecategory (jokeid, categoryid) VALUES
    (1, 2),
    (2, 1),
    (3, 4),
    (4, 3);

    Più pratica in futuro...

  4. #4
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    a me pare che il flusso sia questo

    1. select => prende tutti i joke di un autore dalla tabella joke (N risultati)
    2. primo delete => => scorre gli id dalla select e dalla tabella di correlazione jokecategory cancella i corrispondenti jokeid (N iterazioni perché l'id joke varia per ogni record)
    3. secondo delete => cancella tutti i joke dalla tabella joke di un determinato autore (l'id lo prende in POST ed è univoco). L'iterazione sui record della tabella lo fai via SQL
    4. terzo delete => cancella l'autore dalla tabella autor (l'id lo prende in POST ed è univoco). L'iterazione sui record della tabella lo fai via SQL

  5. #5
    Ho capito, grazie. La variabile $result contiene gli id dei joke, non gli id degli author come $_POST['id']. Nella prima colonna della tabella jokecategory si trovano gli id dei joke non gli id degli author. Dato che voglio cancellare righe che contengono id di joke uso $result e non $_POST['id'] che contiene invece 1 solo id, quello dell’autore del joke non del semplice joke! Non sono centrato, il caso è chiuso.
    Buon sabato e grazie ancora
    Più pratica in futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.