PHP-Skript wird mehrmals aufgerufen

flärbretli

Mitglied
ich mache gerade eine flashgallery mit upload:
aus der swf wird via fileReference ein bild auf den server geladen, gleichzeitig werden noch variabeln an das php script geschickt die dann in die datenbank geschrieben werden.
alles funktioniert nur komischerweise wird das phpscript immer zweimal ausgeführt dh:
es werden 2 einträge in die datenbank geschrieben ein debugmail wird zweimal versendet usw

ich hab keine ahnung woran das liegt, hat jemand eine idee?

actionscript:
PHP:
System.security.allowDomain("http://www.hyperwerk.ch/miru");
import flash.net.FileReference;
var picUpload:Object = new Object();
// Die Funktion selbst
function uploadPictures():Void {
picUpload.onSelect = function(selectedFile:FileReference):Void {
selectedFile.upload("http://www.hyperwerk.ch/miru/mf/load.php?x_pos="+xpos+"&y_pos="+ypos);
}
picUpload.onOpen = function(selectedFile:FileReference):Void {
trace(selectedFile.name);
}
picUpload.onComplete = function(selectedFile:FileReference):Void {
trace(selectedFile.name + " hochgeladen");
}
var Bilddatei:FileReference = new FileReference();
Bilddatei.addListener(picUpload);
Bilddatei.browse([{description: "Image Files", extension: "*.jpg"}]);
};


function onMouseDown (){
xpos = _xmouse;
ypos = _ymouse;
uploadPictures(); 
}
php:
PHP:
<?php


$xpos = $_GET['x_pos'];
$ypos = $_GET['y_pos'];

require_once('connect.php');
	
$query = "SELECT * FROM gal_pics ORDER BY id DESC;";
$res = mysql_query($query);
$letzter_datensatz = mysql_fetch_array($res);
$letzte_id = $letzter_datensatz["id"];
$name = ($letzte_id +1);
$extension = '.jpg';
$image_name = $name . $extension;
$path = 'pics/' .$image_name;
$t_path = 'pics/thumbs/t_' .$image_name;

//bildergrössen
$thumb_scale = 100;
$image_width = 400;
$image_height = 300;


$query = "INSERT INTO gal_pics (x, y, date) VALUES ('$xpos', '$ypos', NOW())";
@mysql_query($query);
		

//move
move_uploaded_file($_FILES['Filedata']['tmp_name'], $path);

chmod($path,0777);

//thumbs

$imagesize = getimagesize($path);	

$orig_width = $imagesize[0];
$orig_height = $imagesize[1];


$switch =0;
$new_width = $thumb_scale;
$new_height = $new_width / ($orig_width / $orig_height);


$imageBorg = @imagecreatefromjpeg($path);
$imageBfin = @imagecreatetruecolor($new_width,$new_height);
@imagecopyresized($imageBfin,$imageBorg,"0","0","0","0",$new_width,$new_height,$imagesize[0],$imagesize[1]);
@imagejpeg($imageBfin,$t_path,"80");
chmod($t_path,0777);

$query = "UPDATE gal_pics SET t_height='$new_height' WHERE id='$name'";
@mysql_query($query);

//scale original bild wenn zu gross
if($orig_height>$image_height or $orig_width>$image_width){
if (($orig_width / $orig_height) < 1) {
	$new_height = $image_height;
	$new_width = $new_height / ($orig_height / $orig_width);
	}else{
		$new_width = $image_width;
		$new_height = $new_width / ($orig_width / $orig_height);
		}

$imageBorg = @imagecreatefromjpeg($path);
$imageBfin = @imagecreatetruecolor($new_width,$new_height);
@imagecopyresized($imageBfin,$imageBorg,"0","0","0","0",$new_width,$new_height,$imagesize[0],$imagesize[1]);
@imagejpeg($imageBfin,$path,"80");

$query = "UPDATE gal_pics SET width='$new_width', height='$new_height' WHERE id='$name'";
@mysql_query($query);
}else{
	$query = "UPDATE gal_pics SET width='$orig_width', height='$orig_height' WHERE id='$name'";
	@mysql_query($query);
}

?>
 
Hi,

Ich würde Dir vorschlagen den Thread auch im Flash-Forum zu posten.. Das Problem rührt definitiv vom AS her... Außer du rufst die Funktion zum Eintragen des Datensatzes irgendwo zwei mal auf (was hier nicht ersichtlich ist).

Ciao,
Mike
 
Hi,

ich sehe nicht ganz ein, warum Du sämtliche Ereignishandler erst beim onMouseDown (worauf auch immer) definieren musst.

Eine Fehlerquells ist auf jeden Fall, den EventListener auch in dieser Funktion (MouseDown) zu definieren: Pro Mausklick bekommt Dein FileReference-Objekt einen neuen Listener verpasst und alle Operationen werden u.U. mehrmals ausgeführt (Listener werden nicht überschrieben).

Gruß
.
 
hi
danke für die antworten

@ mike: ja ich denke auch dass der fehler im as liegt denn der script wird sonst nirgends aufgerufen.
@Tobias: ich kenne mich mit den eventlisterner nicht so aus; wo würdest du den listener definieren

der actionscript ist nur eine testversion. in der endversion soll ein bildupload mit zusätzlichem versenden von variabeln an das php script realisiert werden. ohne doppeltes aufrufen der php datei:)

grüsse
 
Hi,

einfacher wäre es, Du würdest die Datei posten - dann könnte ich meine Änderungsvorschläge gleich testen. ;)

Code:
System.security.allowDomain("http://www.hyperwerk.ch/miru");
import flash.net.FileReference;

var l:Object = new Object();

l.onSelect = function(f:FileReference):Void {
    f.upload("http://www.hyperwerk.ch/miru/mf/load.php?x_pos="+xpos+"&y_pos="+ypos);
}
l.onOpen = function(f:FileReference):Void {
    trace(f.name);
}
l.onComplete = function(f:FileReference):Void {
    trace(f.name + " hochgeladen");
}

var ref:FileReference = new FileReference();
ref.addListener(l);

function doUpload() {
    ref.browse([{description: "Image Files", extension: "*.jpg"}]);
}

Wobei noch zu klären wäre, ob es sich bei Deiner Funktion "onMouseDown" wirklich um einen Mouse-Listener handen soll, oder um eine Funktion, die von einem anderen Ereignis aufgerufen wird.

Gruß
.
 
hallo,

ok also die datei war noch gar nicht vorhanden ;) ich hab jetz einen prototypen gebaut
und ich würde die datei gerne via onRelease uploaden, ich habe noch deine actionscript version eingebaut leider besteht das problem immer noch.
was man vielleicht noch wissen sollte: beim ersten datenbankeintrag sind die bildbreite und höhe 0 erst beim zweiten eintrag sind die richtigen werte drinn.

im anhang das flash und php file
einfach das rote kreuz dragen!

grüsse
 

Anhänge

  • 24321attachment.zip
    8,2 KB · Aufrufe: 18
Zuletzt bearbeitet:
Hi,

die .fla scheint soweit korrekt zu arbeiten (jedenfalls wird die upload-Methode nur einmal aufgerufen). Teste doch mal serverseitig, in welchem Zeitabstand die beiden Aufrufe stattfinden, und welche Werte die Variablen jeweils haben. Als Workaround könntest Du zumindest überprüfen, ob die Bildmaße korrekt übergeben werden und nur dann den dB-Eintrag vornehmen.

Gruß

P.S.: Könnte vielleicht sein, dass das FileReference-Objekt so arbeitet, dass im ersten Durchlauf alle GET-Variablen übergeben werden und dann erst die Datei mit einem weiteren Aufruf abgeschickt wird ... nur ein Schuss ins Blaue. ;)
.
 
jetzt verstehe ich überhaupt nichts mehr

wenn bilder kleiner als 400 x 300 sind (dann skaliert php das zweite bild nicht) funktioniert es manchmal (nur einen eintrag in die db)!!
bei mir werden die einträge meistens in der gleichen sekunde geschrieben was warscheinlich daran liegt dass der server gleich um die ecke steht. beim upload von dir id 42+43 sind ganze 18 sekunden dazwischen(bild). manchmal werden breite und höhe bei beiden einträgen richtig gestetzt manchmal nicht ! ich habe überhaupt keinen plan mehr was hier eigentlich läuft.
ist das php zu buggy geschrieben ( ist eines meiner ersten scripts) ?
oder gibt es eine andere möglichkeit bilder nach dem upload zu skalieren, ist mir nämlich langsam egal wie, hauptsache es läuft.

schonmal vielen dank für die mühe
grüsse aus :mad:

ps falls es irgendwann funktionieren sollte; habe ich eine möglichkeit flash zu benachrichtigen sobald die bilder skaliert auf dem server liegen?
 

Anhänge

  • 24329attachment.jpg
    24329attachment.jpg
    83,3 KB · Aufrufe: 18
Hi,

hast Du mal probiert, das Umwandeln und Skalieren noch mit dem temporären Bild durchzuführen und erst das "fertige" Bild im Zielordner abzulegen?

Ich habe im Moment leider keine Zeit, das Verhalten selbst durchzutesten, aber mach Dir doch mal ein Testsetup mit einem Flashfilm, der einmal eine kleine Datei hochlädt und einem dazugehörigen PHP-Script, das beim Aufruf nur den Namen des temporären Files und den Timestamp in eine Textdatei schreibt. Tritt das Problem (doppelter Aufruf) damit nicht auf, liegt der Fehler wahrscheinlich bei Dir.

Gruß
.
 

Neue Beiträge

Zurück