2013-02-05 6 views
0

J'ai déjà posé cette question, mais j'ai changé de code depuis. J'ai des problèmes avec ce script qui insère des données de formulaire dans une table. La première insertion crée une réservation qui stocke les coordonnées du client. Le deuxième insert prend le ref de réservation créé dans le premier et crée un «JOB» pour le client. L'encart final est censé créer un second «JOB», le retour du client.Insérer dans une table deux fois dans le même script?

Les deux premiers inserts fonctionnent correctement, mais ils ignorent le dernier, le deuxième insert JOB.

J'ai vérifié les structures de la table, et les données ont été transmises au script tout va bien, donc le problème doit être dans le script (voir ci-dessous) toute aide est grandement appréciée.

Est-il correct d'utiliser un script à insérer deux fois dans la même table?

<?php 

    $customer_title   = $_POST['customer_title']; 
    $customer_first_name  = $_POST['customer_first_name']; 
    $customer_last_name  = $_POST['customer_last_name']; 
    $billing_address   = $_POST['billing_address']; 
    $customer_tel    = $_POST['customer_tel']; 
    $customer_mobile   = $_POST['customer_mobile']; 
    $customer_email   = $_POST['customer_email']; 
    $passengers    = $_POST['passengers']; 
    $cases     = $_POST['cases']; 
    $return_flight_number  = $_POST['return_flight_number']; 
    $price     = $_POST['price']; 
    $pickup_date    = $_POST['pickup_date']; 
    $pickup_time    = $_POST['pickup_time']; 
    $pickup_address   = $_POST['pickup_address']; 
    $destination_address  = $_POST['pickup_destination']; 
    $return_date    = $_POST['return_date']; 
    $return_time    = $_POST['return_time']; 
    $return_pickup   = $_POST['return_pickup']; 
    $return_destination  = $_POST['return_destination']; 
    $booking_notes   = $_POST['booking_notes']; 

    $booking_status   = "Confirmed"; 
    $authorised    = "N"; 

    $booking_agent   = "ROOT_TEST"; 
    $booking_date    = date("Y/m/d"); 

if (isset($_POST['customer_title'])) { 

    include('../assets/db_connection.php'); 

    $create_booking = $db->prepare("INSERT INTO bookings(customer_name, billing_address, contact_tel, contact_mob, contact_email, party_pax, party_cases, booking_notes, price, booking_agent, booking_date, booking_status, authorised) 
             VALUES(:customer_name, :billing_address, :contact_tel, :contact_mob, :contact_email, :party_pax, :party_cases, :booking_notes, :price, :booking_agent, :booking_date, :booking_status, :authorised);"); 
    $create_booking->execute(array(
     ":customer_name"  => $customer_title . ' ' . $customer_first_name . ' ' . $customer_last_name, 
     ":billing_address"  => $billing_address, 
     ":contact_tel"   => $customer_tel, 
     ":contact_mob"   => $customer_mobile, 
     ":contact_email"  => $customer_email, 
     ":party_pax"   => $passengers, 
     ":party_cases"   => $cases, 
     ":booking_notes"  => $booking_notes, 
     ":price"    => $price, 
     ":booking_agent"  => $booking_agent, 
     ":booking_date"  => $booking_date, 
     ":booking_status"  => $booking_status, 
     ":authorised"   => $authorised  
    )); 

    $booking_ref = $db->lastInsertId('booking_ref'); // Takes Booking Ref generated in $create_booking 

    $scheduled = "N"; 

    $create_job = $db->prepare("INSERT INTO jobs(booking_ref, pickup_date, pickup_time, pickup_address, destination_address, scheduled) 
           VALUES(:booking_ref, :pickup_date, :pickup_time, :pickup_address, :destination_address, :scheduled)"); 

    $create_job->execute(array(
     ":booking_ref"   => $booking_ref, 
     ":pickup_date"   => $pickup_date, 
     ":pickup_time"   => $pickup_time, 
     ":pickup_address"  => $pickup_address, 
     ":destination_address" => $destination_address, 
     ":scheduled"   => $scheduled 
)); 



    $return = "Y"; 


    $create_return = $db->prepare("INSERT INTO jobs(booking_ref, pickup_date, pickup_time, pickup_address, destination_address, scheduled, return) 
            VALUES(:booking_ref, :pickup_date, :pickup_time, :pickup_address, :destination_address, :scheduled, :return)"); 

    $create_return->execute(array(
     ":booking_ref"   => $booking_ref, 
     ":pickup_date"   => $return_date, 
     ":pickup_time"   => $return_time, 
     ":pickup_address"  => $return_pickup, 
     ":destination_address" => $return_destination, 
     ":scheduled"   => $scheduled, 
     ":return"    => $return 
)); 




} 


?> 
+0

peut vous vardump les valeurs post avant la troisième requête est exécutée et voir si elles contiennent des données correctes? – GGio

+0

Avez-vous réglé 'PDO :: ATTR_ERRMODE' sur' PDO :: ERRMODE_WARNING' (avec 'E_WARNING' activé) ou' PDO :: ERRMODE_EXCEPTION'? –

Répondre

1

Il est incorrect pour sûr, que l'insertion des mêmes données constitue une violation deux fois l'une des lois de l'architecture de base de données les plus importantes - Database Normalization principe

Cependant, il n'y a pas de problèmes techniques avec elle. Il y a une erreur que vous devez attraper en utilisant le message d'erreur de mysql. Pour l'avoir, ajoutez cette ligne après la connexion à PDO.

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Veuillez noter que l'erreur réelle est le seul moyen de déboguer des requêtes SQL. Juste regarder le code n'a aucun sens ni aider.

return doit être un mot-clé mysql. l'écrire comme

`return` 

Par ailleurs, je ne peux pas supporter un tel énormément de code énorme.

Si je vous, je ferais en 10 lignes, et non 50:

$allowed = array('customer_name', 'billing_address', 'contact_tel', 'contact_mob', 
       'contact_email', 'party_pax', 'party_cases', 'booking_notes', 'price'); 
$insert = $db->filterArray($_POST,$allowed); 

$insert['booking_status'] = "Confirmed"; 
$insert['authorised']  = "N"; 
$insert['booking_agent'] = "ROOT_TEST"; 
$insert['booking_date'] = date("Y-m-d"); 

$db->query("INSERT INTO bookings SET ?u", $insert); 
+0

Merci, vous aviez raison, c'était le nom du champ de retour qu'il n'a pas aimé sans '' de chaque côté. Je vais aussi chercher à réduire mon code comme vous l'avez recommandé. Merci encore :) –

0

Il ressemble à booking_ref est la clé primaire dans la table jobs, vous essayez d'insérer la même clé deux fois qui est la raison pour laquelle la requête finale échoue.

Vous devez avoir un champ séparé qui est la clé primaire sur jobs qui est juste un nombre auto-incrémentant, puis créer un index sur booking_ref.

+0

Il y a une clé primaire sur les jobs qui est job_ref, j'ai vérifié sur phpmyadmin et la seule clé primaire est job_ref ​​et booking_ref n'est pas défini sur unique. –

-1

Il n'y a aucune loi contre cela. Ce que vous devez faire est de vérifier la valeur de retour pour la dernière requête INSERT. Ma meilleure estimation est qu'il y a un index unique sur le tableau jobs que vous violez avec le double-insert. Ce n'est pas évident si vous utilisez mySQLi ou PDO ici, mais les deux fonctions d'exécution renvoient false en cas d'erreur, donc vous devriez attraper cela et ensuite appeler les fonctions d'erreur de l'objet respectif pour obtenir ce qui s'est mal passé.

Questions connexes