2

私は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="" />';
?>
4

1 に答える 1

0

まず第一に、このコードを公の場所で使用する前に、実際に対処する必要があるセキュリティ上の問題がいくつかあります。開始する良い方法は、PHP で mysql_* 関数を使用すべきではない理由を確認して、SQL インジェクションの問題を修正することです。PHPでSQLインジェクションを防ぐ方法は?

また、パラメータから直接取得したファイル名GETに書き込むと、攻撃者はシステムのほぼどこにでも書き込むことができます。入力を検証してください。少なくともbasename()のようなものを使用して、少なくともファイルを同じディレクトリに保持してください。

次に、実際の問題に。imagettftext マニュアルに記載されているバージョンの GD ライブラリを実行している可能性があります。

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.
?>
于 2013-06-05T10:51:53.540 に答える