[GELÖST] fehler auf frontpage

Gesperrt
dnano91
Beiträge: 23
Registriert: Do 15. Aug 2013, 12:49
Kontaktdaten:

[GELÖST] fehler auf frontpage

Beitrag von dnano91 » Mi 11. Sep 2013, 19:20

Hallo,

habe ein Fehler mit Contenido 4.8.18. Auf der Frontpage kommt immer folgender Fehler:
Warning: substr() expects parameter 3 to be long, string given in /pfad/front_content.php(931) : eval()'d code on line 554

hier ist die seite: http://wallnerwein.at/front_content.php
hab schon alles versucht. cache löschen, con_code löschen.
es kann sein, dass das update von 4.8.6 was damit zu tun hat.
hab natürlich im cms ordner die daten ersetzt (und die id's richtiggestellt), aber es geht weder mit neuen, noch mit alten.
immer der selbe fehler.
Zuletzt geändert von dnano91 am Fr 13. Sep 2013, 07:39, insgesamt 1-mal geändert.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: fehler auf frontpage

Beitrag von Faar » Mi 11. Sep 2013, 20:42

Das Modul das auf der linken Seite eine Ausgabe macht, hat einen Fehler in substr().
http://www.php.net/manual/de/function.substr.php

substr ( string $string , int $start [, int $length ] )

Code: Alles auswählen

substr ("blabla", 3, 2);
Es wird erwartet, dass zuerst der String kommt, der behandelt werden soll, dann Komma, dann ein Integer Wert für den Startpunkt, dann optional Komma, dann optional ein Integer Wert für die Länge des Substrings.
Offenbar wurde da statt einer Integer Zahl ein String übergeben.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

dnano91
Beiträge: 23
Registriert: Do 15. Aug 2013, 12:49
Kontaktdaten:

Re: fehler auf frontpage

Beitrag von dnano91 » Do 12. Sep 2013, 11:33

ich hatte den gleichen fehler bei einer anderen seite und da ist er verschwunden,
nachdem ich immer die neuen und alten dateien im cms ordner hin und her getauscht habe.
irgendwann war er weg.

wo finde ich denn, welches modul dafür verantwortlich ist und wo kann ich es ändern?
habe nämlich die administration von den bereits bestehenden seiten übernommen und finde das ganze etwas unübersichtlich

EDIT: es ist das plugin Artikelliste. kann ich das irgendwie aktuallisieren? weil es scheint ja ein offizielles contenido plugin zu sein.
ich hab das problem auf mehreren seiten

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: fehler auf frontpage

Beitrag von Faar » Do 12. Sep 2013, 15:19

dnano91 hat geschrieben: wo finde ich denn, welches modul dafür verantwortlich ist und wo kann ich es ändern?

Am einfachsten im Template in der visuellen Vorschau.
Da sieht man in etwa, wo welches Modul sitzt.

EDIT: es ist das plugin Artikelliste. kann ich das irgendwie aktuallisieren? weil es scheint ja ein offizielles contenido plugin zu sein.
ich hab das problem auf mehreren seiten
Hat es diesen Code?

Code: Alles auswählen

         $iStartPos = strpos($sCode, "<!--start:content-->");
         $iEndPos   = strpos($sCode, "<!--end:content-->");
         $iDiffLen  = $iEndPos - $iStartPos;

         $sCode = substr($sCode, $iStartPos, $iDiffLen);
Dann wäre es vermutlich das Article_Include Modul.
Oder ist es die ArticleListAdvanced oder der Vorgänger?
Es könnte auch ein modifiziertes Modul sein mit eigenem Namen "Artikelliste".

Jedenfalls wird hier oben durch strpos() ein integer Wert übergeben (man beachte das kleine i in den Variablennamen wie $iDiffLen).
Mit is_int($iDiffLen) könnte man prüfen, ob es eine integer Zahl ist und im Falle von FALSE, eine Meldung ausgeben z.B. mit echo "Fehler String: ".$iDiffLen;
Dann sähe man schon mal, was da drin steh in dem String.
Vermutlich handelt es sich um einen veralteten oder fehlerhaften Code.
Und wenn das hier und dort eingesetzt wurde, ist klar dass auch da die Fehlermeldung auftaucht.

Im Prinzip kann man solche Module natürlich updaten, aber da muss man genau wissen, welches Modul es ist und ob es nicht von anderer Hand modifiziert wurde.
Im letzteren Fall wäre es fatal, wenn man es updaten würde, denn dann ginge irgendwas verloren.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

dnano91
Beiträge: 23
Registriert: Do 15. Aug 2013, 12:49
Kontaktdaten:

Re: fehler auf frontpage

Beitrag von dnano91 » Do 12. Sep 2013, 19:12

Das ist der code:

Eingabe:

Code: Alles auswählen

/**
* Artikelliste mit I1,H1,T1
*
* Erstellt eine Liste mit allen Artikel bis
* auf den Startartikel.
*
* INPUT
*
* Author Jan Lengowski
* Copyright four for business AG
*/

// selected category
$selected = "CMS_VALUE[0]";

echo "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\">
        <tr valign=\"top\">
          <td>Kategorie wählen:</td>
          <td>
            <select name=\"CMS_VAR[0]\">";
            if($selected!="0" && $selected!=""){
             echo"<option value=\"0\">--- kein ---</option>";

            }else{
            echo"<option selected=\"selected\" value=\"0\">--- kein ---</option>";
            }

            // fetch all categorys
            $query = "SELECT A.idcat, A.level, C.name FROM ".$cfg["tab"]["cat_tree"]." AS A, ".
                     $cfg["tab"]["cat"]." AS B,  ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat ".
                     "AND B.idcat=C.idcat AND C.idlang='$lang' AND B.idclient='$client' ".
                     "AND C.visible=1 ORDER BY A.idtree";
            // execute query
            $db->query($query);

            // loop result and build the options
            while ($db->next_record()) {

              // indent spacer
              $spaces = "|";

              // how many levels
              $levels = $db->f("level");

              for ($i = 0; $i < $levels; $i ++) {
                // add 2 spaces for every level
                $spaces = $spaces . "--";

              } // end for
              
              $spaces .= ">";


              if ($selected == $db->f("idcat")) {
                // selected category
                echo "<option selected=\"selected\" value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";

              } else {
                // category
                echo "<option value=\"". $db->f("idcat") ."\">". $spaces . $db->f("name") ."</option>";

              } // end if

            } // end while

echo "      </select>";

echo "    </td>
        </tr>
        <tr>
          <td>Ã&#339;berschrift</td>
          <td><input type=\"text\" name=\"CMS_VAR[2]\" value=\"CMS_VALUE[2]\"></td>
        </tr>
        <tr>
          <td>Angezeigte Länge in Zeichen</td>
          <td><input type=\"text\" name=\"CMS_VAR[3]\" value=\"CMS_VALUE[3]\"></td>
        </tr>

      </table>";
Ausgabe:

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* REFERENZ MODUL / ARTIKELLISTE
*
* Artikelliste mit Img 1, Head 1, Head 2
*
* Erstellt eine Liste mit allen Artikel bis
* auf den Startartikel.
*
* Author      :     Jan Lengowski
* Copyright   :     four for business AG
* Created     :     15-08-2002
* Modified    :     16-08-2002
************************************************/

// second db class instance
$db2 = new DB_Contenido;

// selected category
$selcat = "CMS_VALUE[0]";

 if($selcat!="0" && $selcat!=""){

// select all articles in category widthout start article
$query = "SELECT ARTLANG.idart, ARTLANG.idartlang FROM ".$cfg["tab"]["cat_art"]." AS CATART, ".
          $cfg["tab"]["art_lang"]." AS ARTLANG ".
         "WHERE CATART.idcat = '$selcat' AND ARTLANG.idart = CATART.idart AND ARTLANG.idlang = '$lang' AND ".
         "ARTLANG.online = '1' ORDER BY CATART.idart DESC";

// execute query
$db->query($query);

unset($articleID);
unset($linkID);

// get id's of sub articles
while ($db->next_record()) {
  $articleID[] = $db->f("idartlang");
  $linkID[] = $db->f("idart");
} // end while

// loop through subarticles

echo '
<table width="180" style="padding-left:15px" border="0" cellspacing="0" cellpadding="10">
<tr>
<td width="180" class="headline" height="25" style="border-bottom:0px; border-left:0px; border-right:0px; border-top:0px; border-color: #1462AD; border-style: none; text-align: center;  padding-left:0px" class="punkte">NEWS</td></tr>
';

if (is_array($articleID)) {

    foreach ($articleID as $key => $value) {

          // select all CMS variables of the article
          $sql = "SELECT * FROM ".$cfg["tab"]["content"]." WHERE idartlang = '$value' AND idtype = '1' AND typeid = '1'";
          $db->query($sql);
          $db->next_record();
          $head = $db->f("value");

          if ( strlen($head) > "CMS_VALUE[3]") {
            $head = substr($head, 0, "CMS_VALUE[3]");
            $head .= '..';
          }

          // link
          $link = $sess->url("front_content.php?client=$client&lang=$lang&idcat=$selcat&idart=$linkID[$key]&m=$m&s=$s");

          echo '<tr><td colspan="2" height="15"style="border: 0px; border-top:0px; border-bottom:0px; border-color: #1462AD; border-style: none; "><a class="news" href="'.$link.'">&raquo; '.urldecode($db->f("value")).'</a></td></tr>';

    } // end while



          unset($headline);
        unset($text);
        
    } // end foreach
    
} // end if (is_array)

echo '</table><br>';


?>

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: fehler auf frontpage

Beitrag von Faar » Do 12. Sep 2013, 22:29

In der Ausgabe steht folgender Code irgendwo:

Code: Alles auswählen

          if ( strlen($head) > "CMS_VALUE[3]") {
            $head = substr($head, 0, "CMS_VALUE[3]");
            $head .= '..';
          }
Dort wird "CMS_VALUE[3]" als Integer Zahl übergeben aber man weiß nie genau, ob da wirklich immer Integer drin ist. Manchmal steht da irgendwas drin, wenn dem "CMS_VALUE[3]" nichts zugeordnet wurde. In unserem Fall hier wohl ein String.
Das ist auch keine saubere Programmierung, man sollte aus eben diesen Fehlergründen es nicht so machen wie oben.
Lieber so:

Code: Alles auswählen

          $int3 = intval("CMS_VALUE[3]");
          if ( strlen($head) > $int3 ) {
            $head = substr($head, 0,  $int3);
            $head .= '..';
          }
Man weiß dann immer noch nicht, was in "CMS_VALUE[3]" wirklich drin steht oder stand, aber man weiß, dass es in ein Integer umgewandelt wird und folglich die Fehlermeldung nicht mehr erscheinen dürfte.
Vielleicht müsste man dann "CMS_VALUE[3]" nochmal irgendwie eingrenzen, also so dass nur vernünftige Zahlen eingetragen werden können.
Vielleicht sollte man das auch gleich dort eingrenzen und überprüfen, wo diese Zahl her kommt, im Formular?
Aber das geht bei diesem Eingabe-Aufbau wohl schlecht:

Code: Alles auswählen

          <td>Angezeigte Länge in Zeichen</td>
          <td><input type=\"text\" name=\"CMS_VAR[3]\" value=\"CMS_VALUE[3]\"></td>
Dann bleibt eben nur noch diese Übergabe als Integer in eine Variable im Ausgabeprogramm (wie ich vorschlug) und am besten noch sinnvoll eingrenzen, nicht dass sowas wie -333333 in der Variablen steht.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

dnano91
Beiträge: 23
Registriert: Do 15. Aug 2013, 12:49
Kontaktdaten:

Re: fehler auf frontpage

Beitrag von dnano91 » Fr 13. Sep 2013, 07:39

Danke, das hat das Problem für mich gelöst.
Bei der Eingabe habe ich es mit JS angepasst: http://www.cambiaresearch.com/articles/ ... -a-textbox

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: [GELÖST] fehler auf frontpage

Beitrag von Faar » Fr 13. Sep 2013, 08:53

Moin,

die Javascript Lösung ist interessant aber auch nur eine halbe Lösung, weil zum einen Javascript benötigt wird und zum anderen nie ganz sicher ist, ob der KeyCode (oder which) auch das richtige Ergebnis liefern.
Besser wäre es schon, wenn man die Eingabe abwartet und dann den Integer Wert der Eingabe vergleicht. Da ist es dann egal welche Tastatur jemand benützt oder ob er Javascript laufen hat oder nicht.
Wie funktioniert das dann mit Mobile Browsern?
Im Zweifel schließt man somit gerne jemand von der Eingabe aus, weil irgendwas anders ist als üblich.
Aber das nur als Hinweis :)

Noch etwas zum Schluss:
Statt korrekten Auslassungspunkte (Ellipse, Hellip) werden hier 2 Punkte ans Ende gesetzt. Typographisch richtig wäre &hellip; (auch &#8230; und ALT + 0133).
Bei abgeschnittenen Wörtern kein Leerzeichen davor und bei beendetem Wort aber abgeschnittenem Satz ein Leerzeichen davor.

Code: Alles auswählen

$head .= ' &hellip;';
Contenido hat dafür feine Funktionen, so z.B. Abkürzen nach einem ganzen Wort:

Code: Alles auswählen

$head = capiStrTrimAfterWord($head, $int3);
$head .= ' &hellip;';
http://faq.contenido.org/content/18/83/ ... utzen.html

VG,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Gesperrt