Einbinden eines php Script

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
JKehr
Posts: 5
Joined: Wed Jan 14, 2009 8:01 pm

Einbinden eines php Script

Post by JKehr » Tue Jul 16, 2013 8:50 pm

Hallo,
ich habe von einem Bekannten ein php Script erhalten, welches auf speziellen Seiten Tabellen ausliest und die Anzahl Zeilen bestimmt und diesen Zähler ausgibt. Ich würde dieses Script gerne auf einer CM Simple Seite einbinden, komme da aber nicht so recht weiter. Wer kann helfen? Hier die Anmerkungen meines Bekannten zum Aufruf und das Script selbst:

Code: Select all

<? include("./kstzaehler.php"); ?> (Einbinden der php-Datei, in der Datei, wo der Zähler genutzt wird)
<? $temp = get_zahl(1); $gesamtzahl += $temp; print $temp; ?> (Auslesen und Schreiben der Zahl zur Tabelle 1)
<? $temp = get_zahl(2); $gesamtzahl += $temp; print $temp; ?> (Auslesen und Schreiben der Zahl zur Tabelle 2)
<? $temp = get_zahl(3); $gesamtzahl += $temp; print $temp; ?> (Auslesen und Schreiben der Zahl zur Tabelle 3)
<? print $gesamtzahl; ?> (Auslesen und Schreiben der Gesamtzahl aller drei Tabellen) 

Code: Select all

<?php

class data_pars {
    
    var $datei;
    var $read_laenge = 2000;
    var $result;
    var $countalex = 0;
    
    function set_datei($datei) {
        
        $this->datei = $datei;
    }
 
    function get_count() {
        
         return $this->countalex-1;
    }

 
    function read($start,$ende) {
        
        $file = @fopen ($this->datei,"r");
    
        while (!feof($file)) {
            
            $inhalt .= fgets($file,$this->read_laenge);
        }
        
        if(!$start) $start = 0;
        if(!$ende) $ende = strlen($inhalt);
        
        if($ende > strlen($inhalt)) $ende = strlen($inhalt);
        
        $this->result = substr($inhalt,$start,$ende);
        
    }
    
    function get_result() {
        
        return $this->result;
    }
    
    function get_in_out($in,$out,$in_out) {
        
    $anzahl_ende = strlen($out);
    $anzahl_start = strlen($in);
    $start = 0; 
    $anzahl = substr_count($this->result, $in);
    $count = 0;
    $this->countalex = 0;
    
    if(!$in_out) {
        
        $ad_start = $anzahl_start;
        $ad_ende = $anzahl_ende;
    }
    
    while($count < $anzahl) {
    
        $ar_start = strpos($this->result, $in, $start);
        $ar_ende = strpos($this->result, $out, $ar_start + $anzahl_start);
        $ar_string = substr($this->result,$ar_start + $ad_start, $ar_ende - $ar_start + $anzahl_ende - $ad_ende - $ad_start);
        
        $output[start][] = $ar_start;
        $output[ende][] = $ar_ende - $ar_start + $anzahl_ende;
        $output[string][] = trim($ar_string);
        
        $start = $ar_start + $anzahl_start;
                
        $count++;
        $this->countalex++;
       
    }    
        
    return $output;
    
    }    
        
    
}

function get_zahl($open) {

$data = new data_pars();

if ($open == 1) {
$data->set_datei('http://www.schachlinks.com/cgi-bin/admin/swiss_iframe.cgi?action=tab_ausgabe&daten_id=9868&table_id=2&session_key=dhlm024qojy&turnier_id=2270');
}



if ($open == 2) {
$data->set_datei('http://www.schachlinks.com/cgi-bin/admin/swiss_iframe.cgi?action=tab_ausgabe&daten_id=9905&table_id=2&session_key=rfuu604olky&turnier_id=2271');
}

if ($open == 3) {
$data->set_datei('http://www.schachlinks.com/cgi-bin/admin/swiss_iframe.cgi?action=tab_ausgabe&daten_id=9963&table_id=2&session_key=yuuo043kkyp&turnier_id=2272');
}

$data->read('0','40000');

$tabelle = $data->get_in_out('<table','</table>',false);

// AUF TABELLE 2 SETZTEN
$data->result = $tabelle['string'][3];

$reihen = $data->get_in_out('<tr','</tr>',false);

return $data->get_count();
}
?>
Vielen Dank und Gruß Jürgen
Last edited by cmb on Tue Jul 16, 2013 9:34 pm, edited 1 time in total.
Reason: Code als solchen formatiert

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Einbinden eines php Script

Post by cmb » Tue Jul 16, 2013 10:00 pm

Hallo Jürgen,

bitte nicht wundern; ich habe mir erlaubt den Code in Deinem Post mal solchen zu formatieren ([ code]), damit man ihn besser lesen kann.

Das einfachste ist vermutlich, wenn Du den Code aus kstzaehler.php in die Datei cmsimple/userfuncs.php packst. Falls es diese Datei noch nicht gibt, dann einfach kstzaehler.php zu cmsimple/userfuncs.php umbenennen. Diese Datei wird bei CMSimple_XH und CMSimple 4 automatisch include't, so dass dieser Punkt schon mal entfällt. Ich gehe hier einfach mal davon aus, dass Du eine dieser beiden CMSimple-Varianten verwendest.

Ginge es nur um das Auslesen und Anzeigen einer Tabelle könntest Du einfach folgendes auf einer CMSimple-Seite notieren:

Code: Select all

{{{PLUGIN:get_zahl(1);}}}
Um alle Zähler anzuzeigen, kannst Du folgendes auf die Seite schreiben:

Code: Select all

#CMSimple $temp = get_zahl(1); $gesamtzahl += $temp; $output .= $temp; $temp = get_zahl(2); $gesamtzahl += $temp; $output .= $temp; $temp = get_zahl(3); $gesamtzahl += $temp; $output .= $temp; $output .= $gesamtzahl;#
Das sollte das gleiche Ergebnis haben, wie die Anmerkungen Deines Bekannten. Allerdings wird das Ergebnis am Ende der Seite angezeigt, und alle Ziffern sind direkt aneinander geklascht, was natürlich wenig sinnvoll ist. Und das ganze ist im Seiteneditor auch nicht gut zu lesen. Leider darf immer nur ein CMSimple-Skript pro Seite verwendet werden.

Also schlage ich vor, dass Du die Funktion get_zahl() in kstzaehler.php bzw. userfuncs.php wie folgt änderst:

Code: Select all

function get_zahl($open=null) {
static $gesamt = 0;
if (!isset($open)) {
    return $gesamt;
}
$data = new data_pars();

if ($open == 1) {
$data->set_datei('http://www.schachlinks.com/cgi-bin/admin/swiss_iframe.cgi?action=tab_ausgabe&daten_id=9868&table_id=2&session_key=dhlm024qojy&turnier_id=2270');
}



if ($open == 2) {
$data->set_datei('http://www.schachlinks.com/cgi-bin/admin/swiss_iframe.cgi?action=tab_ausgabe&daten_id=9905&table_id=2&session_key=rfuu604olky&turnier_id=2271');
}

if ($open == 3) {
$data->set_datei('http://www.schachlinks.com/cgi-bin/admin/swiss_iframe.cgi?action=tab_ausgabe&daten_id=9963&table_id=2&session_key=yuuo043kkyp&turnier_id=2272');
}

$data->read('0','40000');

$tabelle = $data->get_in_out('<table','</table>',false);

// AUF TABELLE 2 SETZTEN
$data->result = $tabelle['string'][3];

$reihen = $data->get_in_out('<tr','</tr>',false);

$einzeln = $data->get_count();
$gesamt += $einzeln;
return $einzeln;
} 
Dann kannst Du auf der CMSimple-Seite folgendes machen:

Code: Select all

{{{PLUGIN:get_zahl(1);}}} (Auslesen und Schreiben der Zahl zur Tabelle 1)
{{{PLUGIN:get_zahl(2);}}} (Auslesen und Schreiben der Zahl zur Tabelle 2)
{{{PLUGIN:get_zahl(3);}}} (Auslesen und Schreiben der Zahl zur Tabelle 3)
{{{PLUGIN:get_zahl();}}} (Schreiben der Gesamtzahl aller drei Tabellen, was aber nur funktioniert, wenn die anderen drei Aufrufe schon auf der Seite erfolgt sind)
Christoph
Christoph M. Becker – Plugins for CMSimple_XH

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Einbinden eines php Script

Post by cmb » Tue Jul 16, 2013 11:42 pm

Da es hier um Schachergebnisse geht: wäre ein Plugin interessant, mit dem man in PGN aufgezeichnete Partien auf der Website nachspielen kann, oder gibt es da schon eine einfach zu verwendende Lösung?
Christoph M. Becker – Plugins for CMSimple_XH

JKehr
Posts: 5
Joined: Wed Jan 14, 2009 8:01 pm

Re: Einbinden eines php Script

Post by JKehr » Thu Jul 18, 2013 6:07 pm

Hallo Christoph,

ich habe den von dir beschriebenen Weg versucht, bekomme aber nun folgende Fehlermeldung:
Header-Information kann nicht geändert werden - die Header wurden bereits verschickt (die Ausgabe begann in /mnt/webh/a1/69/51224069/htdocs/schachschiedsrichter_cm/cmsimple/userfuncs.php:117)

Das Nachspielen von Schachpartien im pgn Format auf CMSimple Seiten geht recht einfach mit dem kostenlosen Tool ChessTheatre von dgt. Ein Beilspiel dazu findest du etwa hier: http://www.seniorenschach-hessen.de Rubrik Partien.
ChessTheatre lässt sich problemlos einbinden.

Gruß
Jürgen

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Einbinden eines php Script

Post by cmb » Thu Jul 18, 2013 10:41 pm

Hallo Jürgen,
JKehr wrote:ich habe den von dir beschriebenen Weg versucht, bekomme aber nun folgende Fehlermeldung:
Header-Information kann nicht geändert werden - die Header wurden bereits verschickt (die Ausgabe begann in /mnt/webh/a1/69/51224069/htdocs/schachschiedsrichter_cm/cmsimple/userfuncs.php:117)
Da befinden sich in userfuncs.php nach dem ?> noch weitere Zeichen, vermutlich Leerzeichen. Kürze einfach die Datei so, dass ?> wirklich die letzten Zeichen sind.
JKehr wrote:Das Nachspielen von Schachpartien im pgn Format auf CMSimple Seiten geht recht einfach mit dem kostenlosen Tool ChessTheatre von dgt. Ein Beilspiel dazu findest du etwa hier: http://www.seniorenschach-hessen.de Rubrik Partien.
ChessTheatre lässt sich problemlos einbinden.
Danke für die Info. Das schau ich mir gerne mal an.

Christoph
Christoph M. Becker – Plugins for CMSimple_XH

JKehr
Posts: 5
Joined: Wed Jan 14, 2009 8:01 pm

Re: Einbinden eines php Script

Post by JKehr » Fri Jul 19, 2013 8:19 am

Hallo Christoph,

kaum macht man es richtig, schon funktionierts ...
(da war noch ein Blank hinter dem ?>)

Hier das Ergebnis: http://www.schachschiedsrichter-hessen. ... Schachtage

Nochmal vielen Dank.
Gruß
Jürgen

wbs
Posts: 122
Joined: Sun Apr 02, 2017 8:05 am

Re: Einbinden eines php Script

Post by wbs » Wed Apr 05, 2017 2:15 pm

Ich würde gerne folgendes Skript einbinden, das Texte zufällig ausgibt:

Code: Select all

<?php
   $random_text = array("Text1","Text2");
   srand(time());
   $sizeof = count($random_text);
   $random = (rand()%$sizeof);
   print("$random_text[$random]");
?>
Ich hatte das im Template, jetzt habe ich aber keine Sidebar mehr und würde es gern in eine Newsbox packen.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Einbinden eines php Script

Post by cmb » Wed Apr 05, 2017 3:37 pm

wbs wrote:Ich würde gerne folgendes Skript einbinden, das Texte zufällig ausgibt:

Code: Select all

<?php
   $random_text = array("Text1","Text2");
   srand(time());
   $sizeof = count($random_text);
   $random = (rand()%$sizeof);
   print("$random_text[$random]");
?>
Ich hatte das im Template, jetzt habe ich aber keine Sidebar mehr und würde es gern in eine Newsbox packen.
Dann erstelle Dir am besten eine Funktion in userfuncs.php:

Code: Select all

<?php
function random_text() {
   $random_text = array("Text1","Text2");
   srand(time());
   $sizeof = count($random_text);
   $random = (rand()%$sizeof);
   print("$random_text[$random]");
}
?>
Und in der Newsbox rufst Du die Funktion dann auf:

Code: Select all

{{{random_text}}}
Das srand(time()) solltest Du besser weglassen; das hilft nicht wirklich, beeinflusst aber andere rand() Aufrufe unter Umständen unerwünscht. Und statt rand() solltest Du besser mt_rand() verwenden; das liefert bessere Zufallswerte.

Und theoretisch ist das %$sizeof nicht korrekt, da es sein kann, dass bestimmte Texte dann öfter gewählt werden als andere. Würde rand() zum Beispiel Werte zwischen 0 und 2 liefern, dann würde die Funktion "Text1" doppelt so oft (nämlich bei 0 und 2) wie "Text2" (bei 1) zurückliefern. In diesem Fall wäre es daher richtig, solange eine neue Zufallszahl zu generieren, bis diese entweder 0 oder 1 ist. Das ist aber wie gesagt Theorie. Wenn Du nur wenige Texte hast, und der Zufallszahlengenerator einen großen Wertebereich hat (was bei mt_rand() gegeben ist), dann passt es schon so wie es ist.
Christoph M. Becker – Plugins for CMSimple_XH

wbs
Posts: 122
Joined: Sun Apr 02, 2017 8:05 am

Re: Einbinden eines php Script

Post by wbs » Wed Apr 05, 2017 4:03 pm

Danke, hab das srand weggelassen und mt_rand genommen. Wie kann man das sonst machen, ohne sizeof? Ich hab, solange ich mich auch schon mit Webentwicklung beschäftige, ich bin sehr lernresistent.

Allerdings verschiebt mir das Aufrufen der Funktion in der Newsbox die H4-Überschrift, die ich drüberhabenmöchte, darunter. Und wenn ich die Newsseite aufrufe, steht da dann nur einer der Texte. Das stört mich natürlich nicht, nur das mit der Überschrift.

cmb
Posts: 14225
Joined: Tue Jun 21, 2011 11:04 am
Location: Bingen, RLP, DE
Contact:

Re: Einbinden eines php Script

Post by cmb » Wed Apr 05, 2017 4:32 pm

wbs wrote:Wie kann man das sonst machen, ohne sizeof?
Eine mögliche Alternative ist array_rand, also etwa:

Code: Select all

$texte = array("Text1", "Text2");
$index = array_rand($texte, 1);
return $texte[$index];
Es kann aber gut sein, dass array_rand() es auch nicht richtig macht(e).

Man kann alternativ auch mt_rand() gleich den gewünschten Bereich mitgeben, also etwa:

Code: Select all

$texte = array("Text1", "Text2");
$index = mt_rand(0, count($texte)-1));
return $texte[$index];
Aber auch hier könnte es sein, dass mt_rand() es nicht richtig macht(e).

Sauber, aber für diesen Fall wie gesagt unnötig aufwendig, wäre etwa folgendes:

Code: Select all

$texte = array("Text1", "Text2");
$scale = (mt_getrandmax()+1) / count($texte);
do {
    $index = mt_rand();
} while ($index >= $scale * count($texte));
return $texte[$index / $scale];
Caveat: wenn mt_rand() mal auf 64bit erweitert werden sollte, dann funktioniert das so nicht mehr.
wbs wrote:Allerdings verschiebt mir das Aufrufen der Funktion in der Newsbox die H4-Überschrift, die ich drüberhabenmöchte, darunter.
Bingo! Innerhalb der Funktion random_text() darf natürlich nicht geprintet werden, sondern returnt. Also letzte Zeile:

Code: Select all

return $random_text[$random]; 
wbs wrote:Und wenn ich die Newsseite aufrufe, steht da dann nur einer der Texte.
Ja klar, denn auch beim Aufruf der Newsseite wird von random_text() nur ein zufälliger Text zurückgeliefert.
Christoph M. Becker – Plugins for CMSimple_XH

Post Reply