2010-05-21 8 views
0
// Getting the id of the restaurant to which we are uploading the pictures 
$restaurant_id = intval($_GET['restaurant-id']); 

if(isset($_POST['submit'])) 
{ 
    $tmp_files = $_FILES['rest_pics']['tmp_name']; 
    $target_files = $_FILES['rest_pics']['name']; 
    $tmp_target = array_combine($tmp_files, $target_files); 
    $upload_dir = $rest_pics_path; 
foreach($tmp_target as $tmp_file => $target_file) 
    { 
     if(move_uploaded_file($tmp_file, $upload_dir."/".$target_file)) 
     { 
      $sql = sprintf(" 
      INSERT INTO rest_pics 
      (branch_id, pic_name) 
      VALUES ('%s', '%s')" 
      , mysql_real_escape_string($restaurant_id) 
      , mysql_real_escape_string(basename($target_file))); 
      $result = mysql_query($sql) or die(mysql_error()); 
     } 

Je reçois l'erreur suivante:Impossible d'ajouter ou mettre à jour une ligne enfant: une contrainte de clé étrangère échoue

Cannot add or update a child row: a foreign key constraint fails (rest_v2 . rest_pics , CONSTRAINT rest_pics_ibfk_1 FOREIGN KEY (branch_id) REFERENCES rest_branches (branch_id) ON DELETE CASCADE ON UPDATE CASCADE

Cependant, cette erreur disparaît totalement et tout se passe bien quand je mets directement l'ID du restaurant (14 par exemple) au lieu de la variable $ restaurant_id dans la requête sql.

am URL obtenir l'id de est: http://localhost/rest_v2/public_html/admin/add-delete-pics.php?restaurant-id=2

Toute aide s'il vous plaît?

Répondre

1

Désolé les gars, je l'ai compris. L'erreur était sous la forme, je:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ... 

au lieu de:

<form action="" ... 

qui a fait la charge de la page sans ses paramètres GET, donc branch_id était porté disparu et qui est la raison pour laquelle cette erreur Sily est survenue.

Merci beaucoup pour vos réponses :)

3

Le problème est que votre requête place $ restaurant_id dans une chaîne. Vous l'avez cité. Vous voulez le remplacer par ceci:

$sql = sprintf(" 
      INSERT INTO rest_pics 
      (branch_id, pic_name) 
      VALUES (%s, '%s')" //<-- I removed the quotes around the first %s 
      , mysql_real_escape_string($restaurant_id) 
      , mysql_real_escape_string(basename($target_file))); 

, vous pouvez également regarder dans PDO au lieu de sortir du mysql_ * fonctions. Ils sont plus propres, plus sûrs, plus rapides et plus modernes. Voici votre même requête en utilisant PDO:

$statement = $db->prepare('INSERT INTO rest_pics (branch_id, pic_name) VALUES (?, ?)'); 
$statement->execute(array($restaurant_id, $target_file)); 

Notez que je ne devais pas faire face à se soucier des guillemets parce que PDO détermine correctement le type de données pour les requêtes qui entrent et qui sortent des résultats. En outre, c'est sûr par défaut - pas d'échappement manuel. En d'autres termes, cela ne serait pas arrivé si vous utilisiez PDO.

+0

et remplacer% s par% i, ne pensez-vous pas? –

+0

J'ai enlevé les citations mais je reçois toujours la même erreur Merci pour votre réponse :) – user306440

+1

@Jaroslav: Ce ne serait pas grave. La requête elle-même est une chaîne. – ryeguy

Questions connexes