[PHP] Bilderzeung (wahrscheinlich Dummheitsfehler)

Stex

Zeta Sagittarii
ID: 54415
L
11 Mai 2006
937
185
Hi,

ich muss zu folgendem sagen, dass ich nie zuvor mit PHP Bilder erzeugt habe, daher keinerlei Erfahrung damit habe (und ich müde bin, aber das nur am Rande *g*)

Jedenfalls habe ich für mich ein kleines Counterscript geschrieben, das sich aus einer Datenbank die Werte für den jeweiligen Counter holt. Bisher hatte ich da nur den aktuellen Stand des Counters gespeichert, jetzt wollte ich jedoch über die Datenbank auch die Maße, sowie Farbe der Schrift und des Hintergrunds anpassen können.

Das Problem ist jetzt, dass kein Bild mehr erzeugt wird, ich finde nur den Fehler nicht. Auch beim letzten mal, als ich die Werte in die Datei geschrieben hatte, kam dieser Fehler am Anfang, ich konnte ihn jedoch durch ausprobieren selbst beheben. Jetzt kriege ich das allerdings nicht hin. Es wäre nett, wenn einer mal einen Blick drauf werfen und mir sagen könnte, woran es liegt. Ich denke, ich hab einfach wieder ne Kleinigkeit übersehen.

Fehler:
Die Grafik "~~counter.php?counterid=1" kann nicht angezeigt werden, weil sie Fehler enthält.
SQL:

Code:
CREATE TABLE `counter` (
  `id` int(20) unsigned NOT NULL auto_increment,
  `name` varchar(200) NOT NULL default '',
  `stand` int(200) NOT NULL default '0',
  `height` int(5) NOT NULL default '0',
  `width` int(5) NOT NULL default '0',
  `left` int(5) NOT NULL default '0',
  `top` int(5) NOT NULL default '0',
  `r` int(3) NOT NULL default '0',
  `g` int(3) NOT NULL default '0',
  `b` int(3) NOT NULL default '0',
  `fr` int(3) NOT NULL default '0',
  `fg` int(3) NOT NULL default '0',
  `fb` int(3) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
counter.php:
PHP:
<?php
Header("Content-Type: image/png");
include('dbconnect.php');

function mysql_queryf()
{
    $args    = func_get_args();
    $query    = array_shift($args);
    $query    .= ' ';
    $query    = preg_replace('/([^\'"])%s([^\'"])/', '\\1"%s"\\2', $query);
    $query    = substr($query, 0, -1);
    $args    = array_map('mysql_real_escape_string', $args);
    return mysql_query(vsprintf($query, $args));
}

$width = 100; 
$height = 17; 
$imgfalse = ImageCreate($width, $height); 

$black = ImageColorAllocate($imgfalse, 0, 0, 0); 
$white = ImageColorAllocate($imgfalse, 255, 255, 255); 

ImageFill($imgfalse, 0, 0, $white);

if (!$counterid):
    ImageString($imgfalse, 3, 25, 6, "ungültig", $black);
    imagepng($imgfalse);
    ImageDestroy($imgfalse); 
endif;

if ($counterid):
    SetCookie("counterlock","...",time()+3600);
    $query = mysql_queryf("SELECT stand FROM counter WHERE id = %d", $counterid);
    $row = mysql_fetch_object($query);
    $counterstand = $row->stand;
    $width = $row->width;
    $height = $row->height;
    $img = ImageCreate($width, $height);
    $color = imagecolorallocate($img, $row->r, $row->g, $row->b);
    $fcolor = imagecolorallocate($img, $row->fr, $row->fg, $row->fb);
    Imagefill($img, 0, 0, $color);
    if (!$counterlock):
        $counterstand = $counterstand + 1;
        $query = "UPDATE counter SET stand = ".$counterstand." WHERE id = ".$counterid;
        $row = mysql_query($query);
    endif;
    ImageString($img, 3, $row->left, $row->top, "$counterstand", $fcolor);
    imagepng($img);
    ImageDestroy($img); 
endif;


?>
 
Zuletzt bearbeitet:
PHP:
Warning:  imagepng(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 48

Warning:  imagedestroy(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 49
hm... kam die jetzt nur, weil der Header fehlte oder käme sie auch sonst?

EDIT: Ah, ok. Die kam, weil in dem Falle gar kein $img vorhanden war, sondern nur ein $imgfalse.

Hab den Code im ersten posting aktualisiert, sodass jetzt die Bedingungen zumindest funktionieren.
Wenn ich das Ding ohne $counterid aufrufe, bringt er mir mit Header die Fehlermeldung von oben und ohne Header scheinbar den Inhalt eines Bildes, also mit den Karos usw.

Wenn ich es ohne header mit $counterid aufrufe, kommt eine ganze Menge:

Warning: imagecreate() [function.imagecreate]: Invalid image dimensions in /var/www/web54/html/extern/counter/counter.php on line 38

Warning: imagecolorallocate(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 39

Warning: imagecolorallocate(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 40

Warning: imagefill(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 41

Warning: imagestring(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 47

Warning: imagepng(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 48

Warning: imagedestroy(): supplied argument is not a valid Image resource in /var/www/web54/html/extern/counter/counter.php on line 49


Das mit der falschen größe verstehe ich nicht. in der datenbank steht eindeutig 100 x 17, also width=100 und height=17
 
Zuletzt bearbeitet:
Ich hab mal Spaß dran gehabt, am Code rumzufrickeln.
Also bei mir geht das mit folgenden Code:
PHP:
<?php
Header("Content-Type: image/png");
include('dbconnect.php');
#mysql_connect("localhost", "root", "");
#mysql_select_db("test");

$counterid = (integer)$_GET['counterid'];
$counterlock = isset($_COOKIE['counterlock']) ? $_COOKIE['counterlock'] : false;

function mysql_queryf()
{
    $args    = func_get_args();
    $query    = array_shift($args);
    $query    .= ' ';
    $query    = preg_replace('/([^\'"])%s([^\'"])/', '\\1"%s"\\2', $query);
    $query    = substr($query, 0, -1);
    $args    = array_map('mysql_real_escape_string', $args);
    return mysql_query(vsprintf($query, $args));
}

$width = 100;
$height = 17;
$imgfalse = ImageCreate($width, $height);

$black = ImageColorAllocate($imgfalse, 0, 0, 0);
$white = ImageColorAllocate($imgfalse, 255, 255, 255);

ImageFill($imgfalse, 0, 0, $white);

if (!$counterid):
    ImageString($imgfalse, 3, 25, 6, "ungültig", $black);
endif;

if ($counterid):
    SetCookie("counterlock","...",time()+3600);
    $query = mysql_queryf("SELECT * FROM counter WHERE id = %d", $counterid);
    $row = mysql_fetch_object($query);
    //var_dump($row);
    $counterstand = $row->stand;
    $left = $row->left;
    $top = $row->top;
    $width = $row->width;
    $height = $row->height;
    $img = ImageCreate($width, $height);
    $color = imagecolorallocate($img, $row->r, $row->g, $row->b);
    $fcolor = imagecolorallocate($img, $row->fr, $row->fg, $row->fb);
    Imagefill($img, 0, 0, $color);
    if (!$counterlock):
        $counterstand = $counterstand + 1;
        $query = "UPDATE counter SET stand = ".$counterstand." WHERE id = ".$counterid;
        $row = mysql_query($query);
    endif;
    ImageString($img, 3, $left, $top, "$counterstand", $fcolor);
endif;

imagepng($img);
ImageDestroy($img)
?>
Voraussetzung die $counterid ist in der Datenbank vorhanden ;)


EDIT: Sicherheitshalber der von mir benutzte Datensatz:
Code:
insert into counter VALUES (2,'TEST', 1, 20, 100, 0, 0, 255, 0, 0, 64, 64, 64);
Aufruf:
https://localhost/counter.php?counterid=2
 
Zuletzt bearbeitet:
<img>Die Grafik "https://www.ernesforum.de/extern/counter/counter.php?counterid=1" kann nicht angezeigt werden, weil sie Fehler enthält.

@Icy: Habe deinen Code übernommen, aber irgendwie macht er es immer noch nicht...
Wenn ich eine existierende $counterid nehme, bekomme ich folgendes ohne Header geliefert, mit Header die obige Fehlermeldung

‰PNG  ??? IHDR???d??????Ûe???PLTEÿÿÿ???UÂÓ~????IDAT™c` ?0øøøxŒgQ8Û,ç?Œ±ÈC¨4Üa|¾Á»ñ ¡RÂpf2o6‚W÷çóg„ Ä?½ãWç4R¬????IEND®B`‚


Ohne $counterid kommt im moment nichts zu stande, das muss ich dann noch ändern
 
Ok, ich habe den Fehler gefunden. Er lag gar nicht in der der Datei, sondern in der dbconnect.php, in der hinter dem ?> noch eine Leerzeile war, die Icy eben meinte. :-?

Warum mein Code oben immer einen Fehler wegen der Bildgröße brachte, Icys aber nicht, ist mir noch nicht so ganz klar, aber jetzt funktionierts ja.

Danke nochmal!