2009-10-23 8 views
1

Hé les gars, j'ai des problèmes avec ce que semble pour être assez facile. Laissez-moi vous dire ce que j'essaie de faire, et ensuite je vais coller dans mon code commenté.Pourquoi MySQL insère-t-il 3 valeurs au lieu de 1?

Je suis en train de:

  1. Connectez-vous à MySQL
  2. Insérer une valeur incrémentiel (l'id)
  3. stocker temporairement la valeur [i utilisé mysql_insert_id()]
  4. Upload et redimensionner une image en utilisant le class.upload.php et donnez-lui le nom en utilisant le dernier ID inséré
  5. Afficher le fichier téléchargé, et permettre à l'utilisateur de jcrop dans une miniature

C'est là que tout l'enfer se déchaîne.

  1. magasin la vignette aussi en lui donnant le nom à l'aide du dernier id Inséré

Ce que je pense qui se passe réellement est:

La requête INSERT répète pour chaque étape (upload, jcrop et affichage des vignettes) et donc il insère 3 valeurs. Donc, ce qui se passe est qu'il donne le nom de l'image [initialement] téléchargé de 3, mais cherche l'image 4 pour créer la vignette, puis la page qui montre l'erreur (qui est censée me montrer la vignette) insère une autre ligne dans MySQL. Après tout ce qui se passe, la prochaine fois que je veux télécharger une image, il donne l'ID de téléchargement initial de 6.

Je suis devenu fou, en essayant d'utiliser différentes méthodes d'insertion de la ligne, mais il semble que le nom de fichier doesn Ne pas passer à chacune des étapes en utilisant une autre méthode. J'ai essayé d'utiliser:

  • méthode include_once pour insérer la ligne

  • diviser le processus en 2 pages, où t le firstpage insère une ligne, puis POSTs à l'aide de champ masqué

  • déplacer l'insert de mysql dans l'une des les autres étapes (ne marche pas passer le dernier identifiant dans une autre étape)

Voici mon code:

<?php 

    //connect to MySQL 
    $dbname = "****"; 
    $username = "****"; 
    $password = "****"; 
    $hostname = "localhost"; 

    //connection to the database 
    $dbhandle = mysql_connect($hostname, $username, $password) 
    or die("<br/><h1>Unable to connect to MySQL, please contact support at [email protected]</h1>"); 

    //select a database to work with 
    $selected = mysql_select_db($dbname, $dbhandle) 
    or die("Could not select database."); 

    //insert an auto_incrementing value into the 'pictures' table 
    if (!$result = mysql_query("INSERT INTO `pictures` VALUES ('')")) 
    echo 'mysql error: '.mysql_error(); 

    $filename = mysql_insert_id(); 

?> 
<?php 

//submit coordinates of jcrop preview 
if ($_POST['submit_coords']) 
{ 

$targ_w = 180; // desired width of thumbnail 
$targ_h = 60; // desired height of thumbnail 
$jpeg_quality = 90; // desired jpeg quality 
$src = 'f/'.$filename.'.jpg'; // get path to the resized image 

// Fetch the uploaded jpeg file 
$img_r = imageCreateFromJpeg($src); 

//Use these proportions 
$dst_r = ImageCreateTrueColor($targ_w, $targ_h); 

// Get coordinates from jcop, and create thumbnail 
imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'], $targ_w,$targ_h,$_POST['w'],$_POST['h']); 

// save the thumbnail and echo the result 
$output_file = 't/'.$filename.'.jpg'; 
imagejpeg($dst_r, $output_file, $jpeg_quality); 
$results = <<<EOT 
<img src="t/$filename.jpg"/> 
EOT; 
echo $results; 
die(); 
} 

// upload & resize mig image 
if ($_POST['upload_image'] && $_FILES['image_upload']) 
{ 
require_once '../lib/jcrop/class.upload.php'; 

$ih = new Upload($_FILES['image_upload']); 
if ($ih->uploaded) { 
    //save full size 
    $ih->file_new_name_body = $filename; 
    $ih->file_new_name_ext = 'jpg'; 
    $ih->image_resize = true; 
    $ih->image_x = 860; 
    $ih->image_ratio_y = true; 
    $ih->process('f/'); 
    if ($ih->processed) { 

    $x = $ih->image_dst_x; 
    $y = $ih->image_dst_y; 
    echo 'image resized'; 

    $ih->clean(); 
    } else { 
    echo 'error : ' . $ih->error; 
    } 

} 

//if succesful show the thumbnail preview 
$output = <<<EOT 
<img src="f/$filename.jpg" id="jcrop" /> 
<br /> 
<div style="overflow: hidden; width: 180px; height: 60px;"> 
<img src="f/$filename.jpg" id="preview" /> 
</div> 
EOT; 

// Show uploaded image, and allow jcrop 
$head = <<<EOT 
<link rel="stylesheet" href="../lib/jcrop/jquery.Jcrop.css" type="text/css" /> 
<script type="text/javascript" src="../lib/jcrop/jquery.min.js"></script> 
<script type="text/javascript" src="../lib/jcrop/jquery.Jcrop.min.js"></script> 
<script> 
$(function(){ 
function showPreview(coords) 
{ 
    var rx = 180/coords.w; 
    var ry = 60/coords.h; 

    $('#preview').css({ 
    width: Math.round(rx * $x) + 'px', 
    height: Math.round(ry * $y) + 'px', 
    marginLeft: '-' + Math.round(rx * coords.x) + 'px', 
    marginTop: '-' + Math.round(ry * coords.y) + 'px' 
    }); 
}; 

function insertCoords(c) 
{ 
    $('#x').val(c.x); 
    $('#y').val(c.y); 
    $('#x2').val(c.x2); 
    $('#y2').val(c.y2); 
    $('#w').val(c.w); 
    $('#h').val(c.h); 
}; 


$('#jcrop').Jcrop({ 
    onChange: showPreview, 
    onSelect: insertCoords, 
    aspectRatio: 3 
}); 
}); 
</script> 
EOT; 
} 
?> 

<html> 
<head> 
<?php if ($head) echo $head; ?> 
</head> 
<body> 
<?php if (!$head) : ?> 
<form action="" method="POST" enctype="multipart/form-data"> 
<input type="file" name="image_upload" /> 
<input type="submit" name="upload_image" value="click me" /> 
</form> 
<?php else : ?> 
<form action="" method="POST"> 
<input type="hidden" name="x" id="x" /> 
<input type="hidden" name="y" id="y" /> 
<input type="hidden" name="x2" id="x2" /> 
<input type="hidden" name="y2" id="y2" /> 
<input type="hidden" name="w" id="w" /> 
<input type="hidden" name="h" id="h" /> 
<input type="hidden" name="filename" id="filename" value="<?php echo $filename ?>" /> 
<input type="submit" name="submit_coords" value="gogo" /> 
</form> 
<?php endif; ?> 
<?php if ($output) echo $output; ?> 
</body> 
</html> 

S'il vous plaît, s'il vous plaît, si vous pouviez aider de quelque façon, ou au moins proposer une solution de rechange, je serais très heureux.

Merci beaucoup d'avance.

Répondre

4

À première vue, je suggère que les premières lignes de code pour insérer la nouvelle ligne devraient aller juste avant le code de téléchargement.à-dire après les éléments suivants:

if ($_POST['upload_image'] && $_FILES['image_upload']) 
{ 
require_once '../lib/jcrop/class.upload.php'; 
    //connect to MySQL 
    $dbname = "****"; 
    $username = "****"; 
    $password = "****"; 
    $hostname = "localhost"; 

    //connection to the database 
    $dbhandle = mysql_connect($hostname, $username, $password) 
    or die("<br/><h1>Unable to connect to MySQL, please contact support at [email protected]</h1>"); 

    //select a database to work with 
    $selected = mysql_select_db($dbname, $dbhandle) 
    or die("Could not select database."); 

    //insert an auto_incrementing value into the 'pictures' table 
    if (!$result = mysql_query("INSERT INTO `pictures` VALUES ('')")) 
    echo 'mysql error: '.mysql_error(); 

    $filename = mysql_insert_id(); 

Puis juste sous

if ($_POST['submit_coords']) 
{ 

devrait être

$filename = $_POST['filename']; 
+0

Ça a marché !!! Oh, les mots ne peuvent exprimer le poids qui vient de tomber de mes épaules. La date limite de ces choses est dans quelques heures! Si vous souhaitez voir une démonstration de la façon dont cela fonctionne, s'il vous plaît faites le moi savoir, et je serais heureux de vous montrer. Aussi, si vous souhaitez un zip des fichiers, je l'enverrai aussi. C'est en fait plutôt cool et original! Encore une fois, merci beaucoup, vous êtes une saveur de vie! –

0

De ce que je comprends votre script est appelé dans son ensemble pour chacune des trois opérations et vous décider quoi faire via les instructions if incluant la variable $ _POST. De cette façon, pour chaque appel, vous faites un insert, c'est pourquoi il y a 3 valeurs au lieu d'une.

Vous devez déplacer votre requête MySQL INSERT dans la première branche si elle est exécutée puis renvoyer une sorte de référence (probablement l'identifiant) au navigateur qui sera ensuite renvoyé à votre serveur pour les étapes suivantes. N'oubliez pas de valider cette référence à chaque fois.

Questions connexes