PHP Undefinierte Variable beim generieren eines Bildes

Picus

Lt. Commander
Registriert
März 2011
Beiträge
1.079
Hallo zusammen,

folgender Code soll eine ID aus der URL nehmen und mit Hilfe dieser einen Namen aus einer MySQL Datenbank erhalten sowie danach ein Bild mit dem Namen generieren.
Code:
<?php
	/* DATABASE
	---------------------------------------------------------------------- */
	// Database credentials
	$servername = 'localhost';
	$username = '1';
	$password = '2';
	$dbname = '3';

	// Create connection
	$con = mysqli_connect($servername, $username, $password, $dbname);
	
	// Get Query String 'id' from URL
	if (isset($_GET['id'])) { 
		$user_id = $_GET['id'];
	}

	// Get Name from Database
	if (isset($user_id)) {
		$sql_get_id = mysqli_query($con, "SELECT first_name FROM user WHERE id='$user_id'");
		$sql_get_id = mysqli_fetch_array($sql_get_id, MYSQLI_ASSOC);
		$user_firt_name = $sql_get_id['first_name'];
	}


	/* IMAGE GENERATOR
	---------------------------------------------------------------------- */
	// Header type
	header('Content-type: image/png');

	// Get picture template
	$im = ImageCreateFromPNG('inc/images/blabla.png');
	ImageSaveAlpha($im, true);

	// Font size
	$size = 36;

	// Angle
	$angle = 0;

	// Coordinates
	$x = 220;
	$y = 180;

	// Font color
	$color = ImageColorAllocate($im, 255, 255, 255);

	// Font type
	$fontfile = 'inc/fonts/OpenSans-Regular.ttf';

	// Write name on template
	ImageTTFText($im, $size, $angle, $x, $y, $color, $fontfile, $user_firt_name);

	// Output result
	ImagePNG($im);
?>
Das ganze funktioniert auch bestens wenn ich es einfach mit einem echo als Text ausgebe (das Ergebnis ist ein einfaches String). Will ich die Variable jedoch zum generieren des Bildes benutzen, funktioniert das ganze nicht mehr und ich erhalte ein Bild ohne Text. Schreibe ich irgendeinen beliebigen Text als Variable vor die Funktion, funktioniert das ebenfalls ohne Probleme (um Fontfile, Koordinaten usw. auszuschließen).

Im Error Log heißt es: "PHP message: PHP Notice: Undefined variable: user_firt_name [...]"

Leider wird mir nicht klar wieso die Variable nicht definiert ist, wenn ich sie vorhin noch ohne den Generator mit echo ausgeben konnte...

Hoffe, mir kann jemand helfen, bin relativ neu in PHP :)
 
von der DB zurückgegebene Werte IMMER auf vollständigkeit prüfen! In deinem Fall existiert die user_id wohl nicht, oder der query schlägt aus anderen gründen fehl.
 
user_id existiert und wird der URL entnommen.

Das ganze funktioniert und wurde ja ohne den Bild Generator Part erfolgreich getestet. Trotzdem danke!
 
was gibt var_dump($user_firt_name); in zeile 24 aus?

//PS: schreibfehler wie firt statt first können dir später das Leben schwer machen, gleich beheben ;)
 
Code:
string(5) "Peter"
Wie gesagt, ist nen einfaches String.

Und danke, Schreibfehler ist korrigiert :D
 
Du setzt $user_first_name doch nur, wenn eine $user_id über den query string, also als GET-Parameter übergeben wird?

Soll heißen:
In jedem Fall benutzt du die Variable, aber nur wenn $user_id gesetzt ist, ist auch $user_first_name definiert.

Oh, und du solltest aufpassen. In deiner jetzigen Umsetzung hast du Tor und Türen für SQL-Injections geöffnet: https://secure.php.net/manual/de/security.database.sql-injection.php
 
Das ist ja kein Problem, weil ohne user_id kein Datenbankeintrag existieren kann. Ergo muss die ID immer existieren und somit kann ich auch $user_first_name nutzen.

Wie gesagt das ganze funktioniert ja mittels einfachem echo wunderbar. Ich versteh nur nicht wieso er die Variable nicht für das Generieren des Bildes nutzen kann. Hat es vielleicht irgendwas mit dem PNG Header zu tun?

Und danke für den Tipp mit den SQL Injections. Muss mich da noch einlesen :)
 
Das ist sicher ein Problem.

Ohne $user_id ist die Variable $user_first_name nicht definiert und du versuchst in Zeile 52 dann mittels ImageTTFText() Text zu schreiben mittels eben jener undefinierten Variable.

Sicher, dass $_GET["user_id"] immer vorhanden / gesetzt ist?
 
PHP:
// Create connection
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password, array(PDO::ATTR_PERSISTENT => false));

// Get Query String 'id' from URL
$user_id = 0;
if (isset($_GET['id'])) {
    $user_id = $_GET['id'];
}

// Get Name from Database
$stmt = $pdo->prepare("SELECT first_name FROM user WHERE id=:userid");
$stmt->execute(array(':userid' => $user_id));
$result = $stmt->fetch();

$user_first_name = '';
if($result) {
    $user_first_name = array_pop($result);
}
Der Bildgenerator kann so bleiben.
 
CryNickSystems schrieb:
Sicher, dass $_GET["user_id"] immer vorhanden / gesetzt ist?
Ja, das ist immer der Fall. Wie gesagt es ist alles schon ohne den Generator getestet und funktioniert wunderbar...

@r15ch13: Was hat PDO denn für Vorteile?
Für mich ist MySQLi Procedural einfach lesbar. Müsste eben noch "mysqli_real_escape_string" verwenden, wenn ich das richtig verstanden habe.

Aber was ist denn jetzt das Problem? Wieso kann ich $user_first_name mit echo ausgeben aber nicht im Generator verwenden? Für mich macht das keinen Sinn und die Error Logs verraten mir auch nichts.

Edit: Welchen Nutzen haben Zeile 5 und 15?
Code:
$user_id = 0;
$user_first_name = '';
 
Zuletzt bearbeitet:
Mit PDO kannst du einfach die Datenbank Engine wechseln (z.B. sqlite, mssql) und die Prepared Statements geben zusaetzlich Sicherheit im Gegensatz zu "mysqli_real_escape_string".
Mit den Zeilen 5 und 15 werden die Variablen mit einem Standardwert belegt (initialisiert).
Als Tip: Versuch mal xdebug in deiner PHP Version zu aktivieren und das Error Reporting auf Vollgas zu drehen. Dann bekommst du ein paar nette Hinweise von PHP geliefert wenn du nicht initialisierte Variablen verwenden willst, wie im Fall von $user_first_name.
 
Ich habe jetzt Debugging mithilfe folgender Zeilen probiert:
Code:
error_reporting(E_ALL);
ini_set("display_errors", 1);

Rufe ich domain.com/generate.php?id=123456 auf, erscheint das Bild erfolgreich samt Inhalt aus $user_first_name!

Wenn ich generate.php aber per folgender Zeile in eine andere Datei einfüge, dann scheint das ganze nicht mehr zu funktionieren.
Code:
<img src="generate.php">

Anscheinend $user_first_name deswegen leer weil $_GET['id'] gar nicht funktionieren kann... liegt das am img Tag? Wie kann ich das Problem umgehen?
 
... :D

Gut, jetzt wo mir der Fehler klar ist, komm ich wohl von allein weiter.

Danke für die vielen Denkanstöße! :)

Edit: Hab jetzt den MySQLi Code zu PDO umgeschrieben und würde mir das gerne hier validieren lassen
PHP:
// Create connection
$con = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
					
// Get query string 'id' from URL
$user_id = 0;
if (isset($_GET['id'])) { 
	$user_id = $_GET['id'];
}

// Get user data from database
$user_first_name = '';
if (isset($user_id)) {
	$check_user_id = $con->prepare("SELECT first_name FROM user WHERE id=:userid");
	$check_user_id->execute(array(':userid' => $user_id));
	$check_user_id = $check_user_id->fetch(PDO::FETCH_ASSOC);
	$user_first_name = $check_user_id['first_name'];
}

// Close database connection
$con = null;
Funktionieren tut das Ganze schonmal und dank Prepared Statements dürfte der Kollege auch sicher gegen SQL Injections sein.

Ist es eigentlich notwendig Named Parameters zu verwenden oder kann ich auch die Variablen direkt verwenden?

Gibt's wesentliche Unterschiede zu dem Code vonr15ch13?

Frohe Ostern noch :)
 
Zuletzt bearbeitet:
Zurück
Oben