ppmk22
Goto Top

In php seite javascript funktion aufrufen und variablen übergeben

Hallo Leute ich bitte Euch mal wieder um Hilfe.

Ich möchte auf einer Seite die Klicks auf Bildern zählen in dem ich jeden klick in eine mySQL DB schreibe.

Vereinfachter Quelltext
$onMouseDown = 'ONMOUSEDOWN=\'hit("'.$row['id'].'")\'';  
echo '<img border="0" src="'.$row['url'].'" '.$onMouseDown.'>';  

Damit wird also die Javascript Funktion aufgerufen und die id des Bildes wird übergehen. Geht auch soweit.
Wie bekomme ich die Übergebene id in den Link?
<script type="text/javascript" language="javascript">  
function hit(id)
{
    window.location.href="javatest.php?bildID=id";  
}
</script>
Ich denke mal das ich das mit mehren Strings machen, aber wie.
var teil1 = String(window.location.href="javatest.php?bildID=);  
var teil2 = id;
oder irrend wie so.

Hätte ja eigentlich gedacht, das man mit Javascript eine PHP Funktion aufrufen könnte, wenn ich das aber richtig gelesen habe ist das nicht möglich. Richtig?


Lass mich mal überraschen.
Liebe Grüße
Petra

Content-ID: 153174

Url: https://administrator.de/contentid/153174

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

Arano
Arano 16.10.2010 um 02:01:07 Uhr
Goto Top
Hallo Petra

Also..... immer dran denken, PHP ist eine serverseitige Scriptsprache, die PHP-Dateien werden also auf dem Server ausgeführt und nur das was von PHP ausgegeben wird (meistens per "echo") wird an den Client geschickt - also "nur" das HTML/CSS/Javascript. Und diese drei sind wiederum Clientseitig, wissen also absolut gar nichts von PHP oder irgendeinem Server !

Praktisch allerdings ist es dennoch möglich das deine Javascript-Funktion eine Anfrage an den Server schickt, sogenanntes AJAX Mozilla.org - AJAX Getting Started !
So könnte die Javascript-Funktion z.B. "deinserver-de/countImageClick.php?id=x" aufrufen lassen. Dieses Script macht das Datenbankupdate und gibt nur aus ob das Update erfolgreich war oder nicht. Anschließend macht die Funktion was sie sonst noch machen soll.

Darf ich mal fragen in welchem Zusammenhang das steht ?
Ich meine... wer klickt schon einfach so auf Bilder, da muss ja noch irgend ein Sinn dahinter stecken !?

Je nach dem was du da machst: Javascript am besten nur als __extra__ einsetzen. Soll heißen, das eine Website auch bei deaktiviertem Javascript noch funktionieren soll(te). face-wink Daher auch die Frage nach dem Sinn, vielleicht gibt es ja einen besseren Weg und vor allem, nicht so aufwendig wie z.B. mit AJAX.

window.location.href="javatest.php?bildID=" + id;  
Jetzt sollte die Id in der URI stehen.
...was macht den bzw. was soll "javatest.php" denn sonst noch so machen ? Wenn es nur das Datenbankupdate durchführt, dann landet man ja auf einer leeren Seite - irgendwie blöde face-smile
Aber wenn es so ist, könnte man es __ohne__ JS auch so machen:
echo '<a href="javatest.php?bildID='.$row['id'].'" title="beschreibung des ziels"><img border="0" src="'.$row['url'].'" alt="beschreibung des bildes"></a>';  


~Arano
EvilMoe
EvilMoe 16.10.2010 um 11:00:24 Uhr
Goto Top
Aber wenn es so ist, könnte man es __ohne__ JS auch so machen:
echo '<a  
> href="javatest.php?bildID='.$row['id'].'" title="beschreibung des ziels"><img  
> border="0" src="'.$row['url'].'" alt="beschreibung des  
> bildes"></a>';  

Dann sollte in der javatest.php auch eine weiterleitung zum eigentlichen Bild sein. Sonst bekommt man nur eine weiße Seite.
header( 'Location: '.$row['url'] );  
die();

Davor sollte natürlich dein SQL Update kommen.
Arano
Arano 16.10.2010 um 12:03:39 Uhr
Goto Top
Moin moin

genau darauf wollte ich wollte ich hinaus aber das trifft so ja nur zu __wenn__ das das Bild auch angezeigt werden soll, was wiederum der Grund ist der mich nach dem Sinn und Zweck hat fragen lassen !

~Arano

Zitat von PHP-Manual: header()
HTTP/1.1 requires an absolute URI as argument to » Location: including the scheme, hostname and absolute path
ppmk22
ppmk22 16.10.2010 um 13:51:28 Uhr
Goto Top
Vielen dank für die Antworten.

Hab's jetzt noch nicht ausprobiert, weil ich jetzt erstmals den Sinn der ganzen Geschichte loswerden möchte. Vielleicht gibt es denn ja doch noch eine bessere Lösung.
Ist ganz simpel:
Auf der Seite sind ein Haufen Bilder/Smileys die per drag and drop, in z. B.: Emailtexten rein gezogen werden können. Und dafür sollte es jetzt eine Art Ranking geben.

Habt Ihr eine bessere Idee, wie das zu lösen wäre?

LG
Petra
Arano
Arano 16.10.2010 um 17:06:43 Uhr
Goto Top
Moin Patra

Okay, dann ist das von EvilMoe und mir vermutete eh hinfällig ...und das bezüglich Javascript als extra von mir auch *g*

Das würde ich auch per JS lösen und zwar so:
Weil es ein Formular ist, welches eh an den Server gesendet wird, würde ich ein zusätzliches verstecktes Feld anlegen über das die Anzahl der verwendeten Smileys zusätzlich mitgeschickt werden. So kannst du dan in dem PHP-Script das die Formulardaten verarbeitet auch die Auswertung des Smiley-Rankings integrieren.
Entweder schreibt deine hit()-Funktion jedes Smiley in das versteckte Feld oder
die Funktion zählt in einem Array die Häufigkeit der Verwendung mit
<script type="text/javascript">  
var arrSmileyUsed = new Array(
    'lol'   => 0,  
    'mad'   => 0,  
    'devil' => 0,  
    'wink'   => 0,  
    'cry'   => 0  
);
function hit(SMILEY)
{
    arrSmileyUsed[SMILEY] += 1;
}
function transmitSileyUsedCounter(inpFIELD)
{
    // arrSmileyUsed sollte noch in eine JSON Zeichenkette gewandelt werden,
    // dann kann man sie in PHP wieder zu einem verwendatem Array zurückwandeln
    document.getElementById(inpFEILD).value = arrSmileyUsed;
    return true;
}
<form onsubmit="transmitSileyUsedCounter('inpHiddenSmileyUsedArray')">  
  <img src="" alt="" title="" onclick="hit('lol')">  
  <img src="" alt="" title="" onclick="hit('mad')">  
  <img src="" alt="" title="" onclick="hit('devil')">  
  <img src="" alt="" title="" onclick="hit('cry')">  
  <input type="hidden" name="arrSmileyStat" value="" id="inpHiddenSmileyUsedArray">  
</form>
</script>
Also bei jedem Klick auf ein Smiley wir dessen Zähler in dem Array "arrSmileyUsed" um eins erhöht.
Beim Absenden des Formulars wird das Array "arrSmileyUsed" in eine Zeichenkette gewandelt (JSON-Format) und in das versteckte Feld geschrieben wodurch es dann an den Server übertragen wird und dort weiterverarbeitet werden kann.


Ja, so würde ich das tun.
Ein schönes Wochenende
~Tobias

//Edit: Vielleicht sollte man das versteckte Feld mit "noJS" vor belegen, so das im PHP-Script die Auswertung nur durchgeführt wird, wenn die diese auch gezählt wurden (was ja nur bei aktiviertem JS der Fall ist). Das ermöglicht dann im PHP-Script die unterscheidung ob "arrSmileyStat" ein Array ist und die Auswertung durchgeführt werden muss oder ob es eine Zeichenkette="noJS" ist und nichts gemacht wird.
nxclass
nxclass 16.10.2010 um 22:59:13 Uhr
Goto Top
Bilder/Smileys die per drag and drop, in z. B.: Emailtexten rein gezogen werden
... wenn ein HTML Element nur 'angepackt' und weggezogen wird - sollte dann eher das 'onMouseDown' Ereignis benutzt werden.

Ich würde auf ein Art Log Objekt setzen, welches 'MouseDown's auf allen IMG Tags speichert und beim schließen der Webseite per Ajax an deinen Server schickt.

aLog = new Array();

var aNodes = document.getElementsByTagName('img');  
for (var iI=0; iI<aNodes.length; iI++) {
    // ggf. noch auf id oder class prüfen und filtern
    aNodes[iI].onMouseDown = function(e) {
        aLog.push( e.target.src ); // oder eine andere eindeutige Eigenschaft
    }
}

window.onunload = function() {
    //hier per AJAX die Daten aLog senden
}
ppmk22
ppmk22 25.10.2010 um 11:37:55 Uhr
Goto Top
Vielen Dank für die ganzen Vorschläge.
Ich habe jetzt schon mal einen Ansatz mit Eurer Hilfe hingekommen.

<?php
include 'SQL.php';  
$simley_id_array = array ();
$simley_url_array = array ();


mysql_connect("$db_host", "$db_username", "$db_password")or die("kann nicht mit der db verbinden<br>".mysql_error());  
mysql_select_db("$datenbank")or die("kann die db nicht auswählen<br>".mysql_error());  

$result = mysql_query("SELECT * FROM $tabelle");  
if(!$result)
{
    echo "mySQL Abfrage: FAIL" . mysql_error() ."<br>";  
}


while ($row = mysql_fetch_array($result))
{
    array_push ($simley_id_array, $row["id"]);  
    array_push ($simley_url_array, $row["url"]);  
}
?>
<html>
    <head>
        <script type="text/javascript">  
        var smiley = new Array();
        smiley = new Object();
        <?
        for ($i = 0; $i < count ($simley_id_array); $i++)
        {
            echo 'smiley["'.$simley_id_array[$i].'"] = 0;';      
        }
        ?>

        function smiley_hit (id)
        {
                smiley[id]  += 1;
        }


        function test_ausgabe (id)
        {
            if (smiley[id] == 0)
            {
                document.write("null " + id + " " + smiley[id]);  
            }else{
                document.write("nicht null " + id + " " + smiley[id]);  
            }
        }
        
        function array_ausgabe ()
        { 
            for (var i = 0; i < smiley.length; i++)
            {
                document.write ('<br>Elemente in Array : ' + smiley[i]);  
            }
        }

        function eintagen ()
        {
            var String = "?hits=";  
            for (var i = 0; i < smiley.length; i++)
            {
               if (smiley[id] != 0)
                   {
                       String = String + smiley[id] + "-" + smiley[id] + ";";  
                   }
            }
            
            document.location.href="hitEintragen.php" + String;  
            
        }


        </script>

    </head>

    <body onunload="eintagen()">  
        <?
        for ($i = 0; $i < count ($simley_id_array); $i++)
        {
            $onMouseDown = 'ONMOUSEDOWN=\'smiley_hit("'.$simley_id_array[$i].'")\'';  
            echo '<img border="0" src="'.$simley_url_array[$i].'" '.$onMouseDown.'>';  
            echo '<a href="javascript:test_ausgabe('.$simley_id_array[$i] .');"> test_ausgabeausgabe Smiley ID '.$simley_id_array[$i] .' </a><br>';  

        }
        ?>
    <a href="javascript:array_ausgabe();">array ausgabe</a><br>  

    </body>

</html>

<?
mysql_close();
?>

Jetzt meine Fragen:
Wie kann ich das Array mit der wohl fehlerhaften Funktion array_ausgabe () ausgeben?

Ich dachte jetzt das ganze beim verlassen der Seite mit "onunload" einer anderen Seite mit "get" zu übergeben, die das dann in die DB schreibt.
Ungefähr so und da fehlt mir dann auch noch der Ansatz.
if (smiley[id] != 0)
hitEintagen.php?hits=smiley_id-hits;smiley_id-hits;smiley_id-hits.
Denn ganzen String dann auf der hitEintragen.php bei "-" und ";" so zerlegen wie ich es brauche und dann in die DB.

LG
Petra
Arano
Arano 05.12.2010 um 19:53:21 Uhr
Goto Top
Hallo Petra face-smile

Wie sieht es den aus, ist dieses Thema für dich noch aktuelle / ungelöst / gelöst / vergessen / anders gemacht ?


~Arano
PS: Sorry fürs späte Melden, hatte leider kein Internet
ppmk22
ppmk22 16.12.2010 um 22:36:24 Uhr
Goto Top
Ist gelöst, werde meine Lösung noch mal posten.
ppmk22
ppmk22 10.01.2011 um 16:06:13 Uhr
Goto Top
So hier nun meine Lösung

 
<?php
    $yPOS = $_GET["y"];  
    $smileyHitID = $_GET["hitID"];  

    if(!$hitID != "")  
        {
        //hitID KÖNNTE HIER JETZT WEITER VERARBEITET WERDEN
        }

    //BEI MIR KOMMEN DIE SMILEY AUS DER DB, DAMIT DAS BEISPIEL ABER GEHT HABE ICH ES HIER SO GEMACHT
    $smileyArray = array ();
    
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fips_eek.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_afraid.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_pistolen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe02.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegespray.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegeboxen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_stock2.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe07.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe13.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe14.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fips_eek.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_afraid.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_pistolen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe02.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegespray.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegeboxen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_stock2.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe07.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe13.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe14.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fips_eek.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_afraid.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_pistolen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe02.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegespray.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegeboxen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_stock2.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe07.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe13.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe14.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fips_eek.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_afraid.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_pistolen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe02.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegespray.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_fliegeboxen.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_stock2.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe07.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe13.gif");  
    array_push ($smileyArray, "http://www.greensmilies.com/smile/smiley_emoticons_waffe14.gif");  
?>

<html>
    <head>
        <script type="text/javascript">  
            //DAMIT DAS FENSTER NACH DEM NEULADEN WIEDER AN DIE ALTE STELLE SPRINGT
            //IST NUR RELEVANT WENN MEHR SMILEY DA SIND ALS DAS FENSTER HOCH IST
            function posY (y)
            {
                window.scrollTo(0, y);
            }

            //SEITE NEU AUFRUFEN UND DIE GEWÜNSCHTEN VAR ÜBERGEBEN
            function hit (id)
            {
                var y = window.pageYOffset;
                document.location.href="smileyHit.php?hitID=" + id + "&y=" + y;  
            }
        </script>
    </head>
    <body>
            <?php
                //SMILEY AUSGEBEN
                for ($index = 0; $index < count($smileyArray); $index++)
                {
                    //NACH DEM KLICKEN DER MAUS WIRD JS-FUNKTION AUFGERUFEN UND DIE VAR ÜBERGEBEN
                    $onMouseDown = 'ONMOUSEDOWN=\'window.setTimeout("hit('.$index.')", 1000)\'';  
                    echo '<img border="0" src="'. $smileyArray[$index] .'" ' .$onMouseDown. '><br>';  
                }              
                //JS-FUNKTION AUFRUFEN UM DIE ALTE Y POS ZU UEBERGEBEN
                echo '<script type="text/javascript">posY('.$yPOS.');</script>';  
            ?>
    </body>
</html>

LG
Petra