Tutorial von tut.php-quake.net teils nicht kompatibel mit PHP 5.3.0

Baasel

Grünschnabel
Hallo

Ich bin momentan dabei mich durch das Tutorial von tut.php-quake.net durch zu arbeiten. Ab dem Punkt "http://tut.php-quake.net/de/newsext.html#s13" hab ich festgestellt das PHP 5.3.0 nicht recht mit dem Tutorial funktioniert...PHP 5.2.9 funktioniert wunderbar.

Fehler werden nicht angezeigt.
Die Ausgabe vom sql-qry ist unvollständig.


newscomments.php

PHP:
<?php
$ret = array();
$ret['filename'] = 'newscomments.tpl';
$ret['data'] = array();
if (!isset($_GET['ID'])) {
    return 'Benutzen sie nur Links von der Homepage.';
}
if ('' == $ID = trim($_GET['ID'])) {
    return 'Benutzen sie nur Links von der Homepage.';
}

$sql = 'SELECT
            News.ID,
            User.Username AS Autor,
            News.Titel,
            News.Inhalt,
            News.Datum
        FROM
            News
        JOIN
            User ON
            News.AutorID = User.ID
        WHERE
            News.ID = ?';
if (!$stmt = $db->prepare($sql)) {
    return $db->error;
}

$stmt->bind_param('i', $ID);
if (!$stmt->execute()) {
    return $stmt->error;
}
$stmt->bind_result($NewsID, $Autor, $Titel, $Inhalt, $Datum);
if (!$stmt->fetch()) {
    return 'Es wurde keine News mit der angegebenen ID gefunden.';
}

echo $Inhalt;
$stmt->close();

//[...] noch viel mehr php code

$ret['data']['ID'] = $NewsID;
$ret['data']['Autor'] = $Autor;
$ret['data']['Titel'] = $Titel;
$ret['data']['Inhalt'] = $Inhalt;
$ret['data']['Datum'] = $Datum;          
return $ret;
?>

echo $Inhalt gibt aus

Es ist eine desaströse Bilanz für den Handel. Die deutschen Exporte sind im ersten Halbjahr um 23,5 Prozent zurückgegangen. Vor allem nach Russland, aber auch in EU-Länder lieferten die Unternehmen weniger Waren. Dennoch mehren sich die Anzeichen für einen



echo $Inhalt hätte ausgeben müssen (der gesammte Text in der sql db)
Es ist eine desaströse Bilanz für den Handel. Die deutschen Exporte sind im ersten Halbjahr um 23,5 Prozent zurückgegangen. Vor allem nach Russland, aber auch in EU-Länder lieferten die Unternehmen weniger Waren. Dennoch mehren sich die Anzeichen für einen langsamen Aufschwung. Wiesbaden - Die Weltwirtschaft könnte sich schneller als erwartet erholen - schon signalisieren zahllose Indikatoren einen baldigen Aufschwung. Wie drastisch die Konjunktur aber abgestürzt ist, zeigt ein Rückblick ins erste Halbjahr: Um 23,5 Prozent sind die deutschen Exporte von Januar bis Juni eingebrochen, teilte das Statistische Bundesamt am Dienstag in Wiesbaden mit. Insgesamt seien Waren im Wert von 391,2 Milliarden Euro ausgeführt worden. Die Versendungen in EU-Mitgliedsländer verringerten sich nominal um 24,3 Prozent auf 249,8 Milliarden Euro und gingen damit stärker zurück als die deutschen Gesamtausfuhren.


$db = @new MySQLi("localhost", "name", "pw", "test");
Datenbank stimmt(hab ja nur 1ne db), Inhalt stimmt



Aber eins noch...Die News Seite (http://tut.php-quake.net/de/newsext.html#s12) funktioniert dafür aber wunderbar, auch mit php 5.3.0...

PHP:
<?php
$ret = array();
$ret['filename'] = 'news.tpl';
$ret['data'] = array();
$sql = 'SELECT
            News.ID,
            User.Username AS Autor,
            News.Titel,
            News.Inhalt,
            DATE_FORMAT(News.Datum, "%d.%m.%Y - %T") AS Datum,
            News.KatID,
            COUNT(News_Kommentar.ID) AS Anzahl,
            News_Kategorie.Name AS KatName
        FROM
            News            
        JOIN
            User ON
            News.AutorID = User.ID
        LEFT JOIN
            News_Kommentar ON
            News.ID = News_Kommentar.NewsID
        LEFT JOIN
            News_Kategorie ON
            News.KatID = News_Kategorie.ID
        GROUP BY
            News.ID
        ORDER BY
            News.Datum DESC
            ';
if (!$result = $db->query($sql)) {
        return $db->error;
}    
$News = array();


if (!$stmt = $db->prepare($sql)) {
    return $db->error;
}
while ($row = $result->fetch_assoc()) { 
    if (!$stmt->execute()) {
        return $stmt->error;
    }

    $News[] = $row;
}

$stmt->close();
$result->close();

$ret['data']['News'] = $News;

return $ret;
?>



Ausgabe von Inhalt
Es ist eine desaströse Bilanz für den Handel. Die deutschen Exporte sind im ersten Halbjahr um 23,5 Prozent zurückgegangen. Vor allem nach Russland, aber auch in EU-Länder lieferten die Unternehmen weniger Waren. Dennoch mehren sich die Anzeichen für einen langsamen Aufschwung. Wiesbaden - Die Weltwirtschaft könnte sich schneller als erwartet erholen - schon signalisieren zahllose Indikatoren einen baldigen Aufschwung. Wie drastisch die Konjunktur aber abgestürzt ist, zeigt ein Rückblick ins erste Halbjahr: Um 23,5 Prozent sind die deutschen Exporte von Januar bis Juni eingebrochen, teilte das Statistische Bundesamt am Dienstag in Wiesbaden mit. Insgesamt seien Waren im Wert von 391,2 Milliarden Euro ausgeführt worden. Die Versendungen in EU-Mitgliedsländer verringerten sich nominal um 24,3 Prozent auf 249,8 Milliarden Euro und gingen damit stärker zurück als die deutschen Gesamtausfuhren.
 
Ist nicht einfach, da viele Funktionen in quakeeigene Classen ausgelagert sind.
Ev geschieht etwas bei der Zuordnung?
PHP:
$stmt->bind_result($NewsID, $Autor, $Titel, $Inhalt, $Datum);
 
Moin,

bist du sicher, dass die Daten so in der DB stehen, wie du annimmst?

Denn jenes:
Code:
Es ist eine desaströse Bilanz für den Handel. Die deutschen Exporte sind im ersten Halbjahr um 23,5 Prozent zurückgegangen. Vor allem nach Russland, aber auch in EU-Länder lieferten die Unternehmen weniger Waren. Dennoch mehren sich die Anzeichen für einen
...sind erstaunlicherweise genau 256 Zeichen...da liegt der Verdacht nahe, dass der gewählte Datentyp für Inhalt nur 256 Zeichen zulässt.
Überprüfe dass am Besten mal.
 
Ehm, also die Struktur von der DB schaut so aus

Code:
DROP TABLE IF EXISTS `news`;
CREATE TABLE IF NOT EXISTS `news` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `AutorID` int(11) NOT NULL,
  `Titel` varchar(100) COLLATE latin1_general_ci NOT NULL,
  `Datum` datetime NOT NULL,
  `Inhalt` text COLLATE latin1_general_ci NOT NULL,
  `KatID` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13 ;
 
Sorry, aber ich muss mich da yaslaw anschliessen:
Ist nicht einfach, da viele Funktionen in quakeeigene Classen ausgelagert sind.
Ev geschieht etwas bei der Zuordnung?

Eine Ursache im Code des Tutorials kann ich nicht erkennen, und dort ebenfalls das ganze Tutorial durchzuackern, um daraus etwas lauffähiges zur Fehlerdiagnose zu Erstellen, dazu fehlt mir ehrlichgesagt die Muße :-(

Falls du anhand der von dir verwendeten Sourcen eine lauffähige Demo bereitstellen könntest, würde ich mir das angucken...ansonsten muss ich aber passen :(
 
[...] und dort ebenfalls das ganze Tutorial durchzuackern, um daraus etwas lauffähiges zur Fehlerdiagnose zu Erstellen, dazu fehlt mir ehrlichgesagt die Muße :-(

nicht so schlimm ;)

Falls du anhand der von dir verwendeten Sourcen eine lauffähige Demo bereitstellen könntest, würde ich mir das angucken...ansonsten muss ich aber passen :(

Demo: http://baasel.bplaced.net/
Die Page basiert auf dem Tutorial


das gleiche Problem liegt auf auf xampp(php 5.3.0) vor, kann also auch nicht am Hoster liegen
 
Zuletzt bearbeitet:
So Leute, ich habe einiges neues Gefunden

Mein Bug wurde auf php.net gefunden und es hängt mit prepared Statement zusammen. Vielen Dank Sven Mintel für den Hinweis (256). Hätte ich auch selbst drauf kommen müssen...


var_dump($Inhalt);
string(256) "Lirum Larum Löffelstiel[...]"

http://bugs.php.net/bug.php?id=50021


Ich hab auch schon eine Notlösung gefunden für mein Problem...


Vielen dank an alle und grüße

PHP:
<?php
error_reporting(E_ALL); 
$ret = array();
$ret['filename'] = 'newscomments.tpl';
$ret['data'] = array();
if (!isset($_GET['ID'])) {
    return 'Benutzen sie nur Links von der Homepage.';
}
if ('' == $ID = trim($_GET['ID'])) {
    return 'Benutzen sie nur Links von der Homepage.';
}



$sql = 'SELECT
            News.ID,
            News.Inhalt
        FROM
            News
        JOIN
            User ON
            News.AutorID = User.ID
        WHERE
            News.ID = "'.$ID.'"';
 
/*  BUG http://bugs.php.net/bug.php?id=50021
if (!$stmt = $db->query($sql)) {
    return $db->error;
}

$stmt->bind_result($NewsID, $Inhalt);
if (!$stmt->fetch()) {
    return 'Es wurde keine News mit der angegebenen ID gefunden.';
}


var_dump($Inhalt);   
// echo $Inhalt;
$stmt->close();


$ret['data']['ID'] = $NewsID;
$ret['data']['Inhalt'] = $Inhalt;
 */

if (!$result = $db->query($sql)) {
        return $db->error;
}    
$Newscomment = array();


if (!$stmt = $db->prepare($sql)) {
    return $db->error;
}
while ($row = $result->fetch_assoc()) { 
    if (!$stmt->execute()) {
        return $stmt->error;
    }

    $Newscomment[] = $row;
}

$stmt->close();
$result->close();

$ret['data']['News'] = $Newscomment;

return $ret;
?>
 
Zurück