2013-06-05 3 views
2

Я создаю изображение, используя php i, почти код, но я застрял в очень важной точке. Я хочу, чтобы семейство Font по своему выбору было на этом изображении, но только когда я выбираю семейство шрифтов, в противном случае выполняется шрифт по умолчанию. Эта логика работает неправильно. Когда я не выбрал ни одного семейства шрифтов, шрифт по умолчанию запускает и показывает мне ввод, но когда я выбираю любой шрифт, он также запускается и существующее изображение перезаписывается, но оно не показывает мне входные данные на экране.Создать изображение в php

Пожалуйста, расскажите мне, в чем проблема. Вот мой код PHP файла:

<?php 
include_once('includes/includes.inc.php'); 
if(isset($_GET['txt'])){ 
$txt = $_GET['txt']; 
$_SESSION['txt'] = $txt; 
} 

if(!isset($_SESSION['rand'])){ 
    $rand = mt_rand(100,1000); 
    $_SESSION['rand'] = $rand; 
} 

    $im = @imagecreate(288, 288) or die("Cannot Initialize new GD image stream"); 
    $background_color = imagecolorallocate($im, 230, 248, 248); 
    $text_color = imagecolorallocate($im, 85, 85, 85); 



    if(isset($_GET['Smile'])){ 
     $query = mysql_query("SELECT * FROm tbl_fonts WHERE font_name = '".$_GET['Smile']."'"); 
     $get = mysql_fetch_array($query); 
     $desfon = 'images/fonts/'.$get['font_name'].'.ttf'; 
     //echo $desfon; 
     imagettftext($im, 55, 0, 155, 55, $text_color, $desfon, $_SESSION['txt']); 
    } 
    else{ 
     imagestring($im, 55, 155, 55, $_SESSION['txt'], $text_color); 
    } 

    header("Content-Type: image/png"); 
    $filename1 = $_SESSION['txt'].$_SESSION['rand'].'.png'; 
    imagepng($im,$filename); 
    echo '<img src="'.$filename.'" alt="" />'; 
?> 
+1

Если только изображение не показано, что связано с кешем браузера. Попробуйте поставить временную метку с источником изображения, поэтому она всегда использует последнее изображение, что-то вроде

+0

Прежде всего вам нужно вызвать session_start() перед использованием $ _SESSION –

+0

Это позволит злоумышленнику писать файлы где угодно, где текущий пользователь имеет доступ. Вероятно, вы захотите очистить содержимое $ _GET ['txt'], прежде чем использовать его как имя файла. – MatsLindh

ответ

0

Прежде всего, у вас есть несколько вопросов безопасности, вы действительно должны заниматься, прежде чем использовать этот код в любом месте общественности. Хороший способ начать бы фиксируя проблемы SQL-инъекции, глядя на Why shouldn't I use mysql_* functions in PHP? и How to prevent SQL injection in PHP?

Кроме записи на имя файла вы непосредственно получить от параметра GET позволяет атакующему писать практически в любом месте в вашей системе. Убедитесь, что вы подтвердили ввод. По крайней мере, используйте что-то вроде basename(), чтобы поместить файл в тот же каталог.

Тогда к вашей реальной проблеме. Это может быть, что вы используете версию библиотеки GD, которая упоминается в imagettftext manual

В зависимости от версии библиотеки PHP GD используется, когда fontfile не начинается с ведущего/тогда .ttf будет присоединяться к имени файла, и библиотека будет пытаться выполнить поиск этого имени файла по определенному библиотекой пути шрифта.

Таким образом, ее возможно, ваш сервер на самом деле ищет images/fonts/fontname.ttf.ttf, попробуйте использовать его как $desfon = 'images/fonts/'.$get['font_name']; и посмотреть, если он работает.

Он также может быть хорошей идеей, чтобы просто установить GDFONTPATH в верхней части вашего скрипта и просто использовать $desfon = $get['font_name'];

<?php 
// Set the enviroment variable for GD 
putenv('GDFONTPATH=' . dirname(__FILE__).'/images/fonts/'); 
?> 

Другие способы отладки приложения может быть сваливать содержание imagettftext вызова и см., что он говорит. Обратите внимание, что сценарий будет exit, поэтому он не будет создавать фактическое изображение, а просто выводит возвращаемое значение.

<? 
//your script 

var_dump(imagettftext($im, 55, 0, 155, 55, $text_color, $desfon, $_SESSION['txt'])); 
exit(); 

//rest of script. 
?> 
Смежные вопросы