0

私はphpとmysqliを学んでいます。ユーザーが名前と画像をデータベースにアップロードできるようにするプログラムを作成しました。データベース内の名前をクリックすると、その人の写真が表示されます。

以下は私のPHPファイルです。画像が表示されないことを除いて、すべてが機能します。名前をクリックすると、疑問符の付いた青いボックスだけが表示されます。誰かが私のコードを見て、これを解決する方法についてのヒントを教えてもらえますか? ありがとう!

main.php

    <?php

    //Turn on error reporting
    ini_set('display_errors', 'On');
    //Connects to the database
    $mysqli = new mysqli("abc", "abc","abc", "abc");
    if($mysqli->connect_errno){
        echo "Connection error: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }
?>  


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
        <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js"></script>
        <script>$(document).ready(function() {$("form").validate();});</script>
        <title>Homework</title>
        <meta charset="UTF-8">
        <p></p>
    </head>
    <body>
        <div>Homework</div>
        <p></p>
        <div>
            <form method="post" action="index.php" enctype="multipart/form-data">
                Celebrity Name: <input type="text" name="c_name">
                Celebrity Photo: <input type="file" name="c_picture">
                <input type="submit" name="add" value="Upload">
            </form>
        </div>
        <br>
        <div>
        <table>
        <tr>
            <td>See below for a list of celebrities in our database</td>
        </tr>
        <?php
            //Display names in the celebrity database
            if(!($stmt = $mysqli->prepare("SELECT c_id, c_name FROM celebrity"))){
                echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
            }

            if(!$stmt->execute()){
                echo "Execute failed: "  . $mysqli->connect_errno . " " . $mysqli->connect_error;
            }

            if(!$stmt->bind_result($c_id, $c_name)){
                echo "Bind failed: "  . $mysqli->connect_errno . " " . $mysqli->connect_error;
            }

            while($stmt->fetch()){
                echo "<tr><td><a href='img.php?c_id=".$c_id."'>" . $c_name . "</a></td></tr>";
                //echo "<tr>\n<td>\n" . $c_name . "\n</td>\n</tr>";

            }

            $stmt->close();
        ?>
        </table>
        </div>
    </body>
</html>

img.php

    <?php

    //Turn on error reporting
    ini_set('display_errors', 'On');
    //Connects to the database
    $mysqli = new mysqli("blah", "blah","blah", "blah");
    if($mysqli->connect_errno){
        echo "Connection error: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

    $c_id=1;
    //retrieve the blob
    if(!($stmt = $mysqli->prepare("SELECT c_picture FROM celebrity where c_name = ?"))){
        echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
    }

    //if(!($stmt->bind_param("i",$_GET['c_id']))){
    if(!($stmt->bind_param("i",$c_id))){
        echo "Bind failed: "  . $stmt->errno . " " . $stmt->error;
    }

    if(!$stmt->execute()){
        echo "Execute failed: "  . $mysqli->connect_errno . " " . $mysqli->connect_error;
    }

    $stmt->store_result();

    if(!$stmt->bind_result($c_picture)){
        echo "Bind failed: "  . $mysqli->connect_errno . " " . $mysqli->connect_error;
    }

    $stmt->fetch();
    header("Content-Type: image/jpeg");
    echo $c_picture;

    $stmt->close();
?>  

index.php

    <?php

    //Turn on error reporting
    ini_set('display_errors', 'On');
    //Connects to the database
    $mysqli = new mysqli("blah", "blah","blah", "blah");
    if($mysqli->connect_errno){
        echo "Connection error: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

    if($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $errorinfo = $_FILES['c_picture']['error'];
        $img = $_FILES['c_picture']['name'];
        $imgTmp = $_FILES['c_picture']['tmp_name'];
        $imgSize = $_FILES['c_picture']['size'];
        $imgType = $_FILES['c_picture']['type'];
    }

    //Check image type and size
    if (($imgType == 'image/jpeg' || $imgType == 'image/gif' || $imgType == 'image/png') && $imgSize < 1048576)
    {
        //Insert name and image file into celebrity database (c_name, c_picture) values (?, ?)
        if(!($stmt = $mysqli->prepare("INSERT INTO celebrity(c_name, c_picture) VALUES (?, ?)")))
        {
            echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
        }


        if(!($stmt->bind_param("sb",$_POST['c_name'], $img)))
        {
            echo "Bind failed: "  . $stmt->errno . " " . $stmt->error;
        }


        if(!$stmt->execute())
        {
            echo "Execute failed: "  . $stmt->errno . " " . $stmt->error;
        }   
        else 
        {
            echo "Added " . $stmt->affected_rows . " celebrity to database.";
        }

    }
    else
    {
        echo "Only jpegs, gifs, and pngs under 1MB can be uploaded";
    }
?>  
4

3 に答える 3

2

印刷する場合、挿入時に画像データを保存していません。

$img = $_FILES['c_picture']['name'];
echo $img;

これは画像の元の名前であり、代わりにファイル データを保存する必要があります。画像を直接出力したい場合:

header("Content-Type: image/jpeg");
echo file_get_contents($_FILES['c_picture']['tmp_name']);

必要なことは、画像データを$_FILES['c_picture']['tmp_name']取得して、データベースに BLOB または LONGBLOB として保存することです。既に BLOB を使用しているようですので、変更する必要があるのは次のとおりです。

$img = $_FILES['c_picture']['name'];

代わりに、次を使用します。

$img = file_get_contents($_FILES['c_picture']['tmp_name']);

また、ヘッダーは適切な画像タイプを出力する必要があります。おそらくデータベースにも保存できます。

実際のアプリケーションでは、画像のバイナリをデータベースに保存するべきではありません。より良い方法は、画像をフォルダーに保存し、アドレスをデータベースに保存することです。

于 2013-08-02T00:03:39.460 に答える