2

以下は、ファイル(fileImage)をフォルダー(ImageFiles)にアップロードするコードの一部です。しかし、私もやりたいのは、INSERT VALUESコードを使用して、ファイルの場所(ファイルがアップロードされる場所)をデータベースに挿入することです。ファイルの場所を「ImageFile」フィールドに挿入し、「ImageId」には文字列「IMG」を表示してから、文字列の後に数字を含める必要があります。例えば:

私のデータベーステーブルでは、次のようになっています。

ImageId     ImageFile

IMG1        ImageFiles/penguins.png
IMG2        ImageFiles/desert.png
IMG3        ImageFiles/jellyfish.jpg

次に、ファイルをコンピューター'tulips.png'からImageFilesフォルダーにアップロードすると、データベースに次のような値が挿入されます。

ImageId    ImageFile

IMG4       ImageFiles/tulips.png

しかし、これはどのようにコーディングできますか?以下は、ファイルを正常にアップロードし、INSERTVALUESの部分的なコーディングのみを含む現時点での私のコードです。

      move_uploaded_file($_FILES["fileImage"]["tmp_name"],
      "ImageFiles/" . $_FILES["fileImage"]["name"]);
      $result = 1;

      $imagesql = "INSERT INTO Image (ImageId, ImageFile) 
    VALUES ("");

mysql_query($imagesql);
4

6 に答える 6

4

PHPのPDOオブジェクトを使用すると、コードが簡素化されると同時に、(プリペアドステートメントを使用して)より安全になります。

これを行う方法の例を次に示します。

まず、IDを「IMG#」ではなくAUTO_INCREMENT-ed INTとして保存します。これにより、作業が簡単になります(ID値を挿入する必要はありません)。

DROP TABLE IF EXISTS tbl_img_store;
CREATE TABLE tbl_img_store(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    filename VARCHAR(25) --increase this if you think you need to
) ENGINE=InnoDB;

また、データベースをより効率的にするために、構成設定を格納するテーブルを作成します。

DROP TABLE IF EXISTS tbl_img_config;
CREATE TABLE tbl_img_config(
    img_path VARCHAR(50)
);
INSERT INTO tbl_img_config (img_path) VALUES ("http://img.mysite.com/?i=");

PHPに戻ると、次のような大量の画像をすばやく挿入できます。

# Create a DB connection
$db = new PDO("mysql:host=X.X.X.X;dbname=mydb", $user, $pass);

# Compile an array of image paths
$img1path = "img1.png";
$img2path = "img2.png";
$img3path = "img3.png";
$images = array($img1path, $img2path, $img3path);

# Create a query to insert the paths to the db
$sql = "INSERT INTO tbl_img_store (filename) VALUES (?),(?),(?);";
$query = $db->prepare($sql);
$query->execute($images);

# Check rows affected
$rows = $query->rowCount();
echo "$rows images were saved.";
于 2012-04-14T19:15:00.870 に答える
2

これに文字列を使用する代わりに、画像を識別するために自動インクリメントIDを使用する必要があります。

これにより、単一のフィールドを挿入するだけで、自動インクリメントされたフィールドが自動的に更新されるため、プロセスが簡単になります。

$imagesql = "INSERT INTO Image (ImageFile) VALUES ('ImageFiles/".mysql_real_escape_string($_FILES['fileImage']['name'])."')";

その場合、ImageIdは、代わりにAUTOINCREMENTを使用したPRIMARYKEYとしてINT型である必要があります。これは、テーブルを設計するための良い方法でもあります。

于 2012-04-14T19:00:38.403 に答える
1

このようにクエリに値を追加する必要があります

$imagesql = "INSERT INTO Image (ImageId, ImageFile) 
VALUES ('$imageName','$imageFile');";

ただし、問題を回避するために、最初に値を正しくエスケープするようにしてください。また、mysql_関数を使用することはこれ以上推奨されないことに注意してください。代わりに、mysqli_と同等またはそれ以上のPDOを使用してください(PDOを使用すると、DBのエスケープが自動的に処理されます。

于 2012-04-14T18:55:43.197 に答える
1

あなたはMySql自動増分を使うことができます..あなたは心配する必要はありませんIMG IMG2...など

参照:http ://dev.mysql.com/doc/refman/5.5/en/example-auto-increment.html

例:

仮定: ImageId自動増分フィールドです

http://dev.mysql.com/doc/refman/5.5/en/example-auto-increment.html

$tmpName = $_FILES ["fileImage"] ["tmp_name"];
$fileName = $_FILES ["fileImage"] ["tmp_name"];

move_uploaded_file ( $tmpName, $fileName );
$sql = "INSERT INTO Image (ImageId, ImageFile)   VALUES (NULL,'%s');";
mysql_query ( sprintf ( $sql, mysql_real_escape_string ( $fileName ) ) );

画像を取得したいとき

$sql = "SELECT ImageId, ImageFile FROM Image";
$result = mysql_query ( $sql );
while ( $row = mysql_fetch_assoc ( $result ) ) {
    echo "IMG", $row ["ImageId"], " = ", 'ImageFiles/'  , $row ["ImageFile"], PHP_EOL;
}

これを使用する理由

A.IMGそして ImageFiles/それらを数回保存することは効率的ではありません

B.integerベースのIDはvarchar、 `JOINよりも高速で、パフォーマンスも向上します

C.増分値がIMGXどこにあるかを取得するにXは、複数のSQL呼び出しが必要になります..効率的ではありません

于 2012-04-14T18:59:41.383 に答える
0

これが私がすることです。質問への回答については、2番目のファイルの終わり近くでSELECT LAST_INSERT_ID()のmysql_queryを探してください。IDを挿入せず、データベースをauto_incrementにすることに注意してください。

画像はupload.phpを介してアップロードされ、その一部は次のようになります。

<form>
<?php

session_start();

if (isset($error["image"])) echo '<span class="error">'.$error["image"].'</span>'; else echo 'Select an image<span class="required"> *</span>';

if ($imgVars["is_image"] == "J") {
    echo '
<input type="hidden" name="image_url" value="'.$imgVars["image_url"].'">
<input type="hidden" name="image_type" value="'.$imgVars["image_type"].'">
<input type="hidden" name="is_image" value="J">
<img src="'.$imgVars["image_url"].'" width="224" height="168" alt="Image">
<p>Change image?</p>';

?>
<input type="file" name="image">
<input type="submit" name="upload" value="Upload" title="Upload your image">
</form>

次に、アップロードされたファイルはprocess.phpを介して処理され、その一部は次のようになります。

<?php

session_start();

if (!session_is_registered("error"))
    session_register("error");

$error = array();

if (!session_is_registered("imgVars"))
    session_register("imgVars");

foreach($_POST as $varname => $value)
    $imgVars[$varname] = trim(EscapeShellCmd(stripslashes($value)));

$imgVars = array();

if ($imgVars["is_image"] != 'J') {
    $imgVars["is_image"] = 'N';
    if ($_FILES["image"]["size"] > 0) {
        $size = GetImageSize($_FILES["image"]["tmp_name"]);
        $width = $size[0];
        $height = $size[1];
        if(($width != 224) || ($height != 168)) {
            $error["image"] = 'Image dimensions must be exactly 224 x 168 pixel!';
            $imgVars["is_image"] = "N";
        }
        preg_match("/(\.\w+)$/",
            $_FILES["image"]["name"],$match);
        $imagetype = $match[1];
        if (!in_array(strtolower($imagetype), array(".jpg",".jpeg",".gif",".png"))) {
            $error["image"] = 'You may upload only images of type JPEG, GIF and PNG!';
            $imgVars["is_image"] = "N";
        }
        if ($imgVars["is_image"] == "J") {
            $filename = time().$imagetype;
            copy($_FILES["image"]["tmp_name"], "img/".$filename);
            $imgVars["image_url"] = "img/".$filename;
            $imgVars["image_type"] = $imagetype;
        }
    } else {
        $error["image"] = 'Please upload an image!';
    }
}

if (count($error))
{
    header('Location: upload.php');
    exit();
}

// connect to database

$query = "INSERT INTO images SET image_url = '" . $imgVars["image_url"] . "';


if (!($result = @ mysql_query ($query, $connection)))
    die("Your mysql error routine here.");

$rs = mysql_query("SELECT LAST_INSERT_ID()", $connection);
$lid = mysql_fetch_row($rs);
$image_id = $lid[0];

if ($imgVars["is_image"] == 'J') {
    rename ($imgVars["image_url"], "img/".$image_id.$imgVars["image_type"]);
    $query = "UPDATE images SET image_url = 'img/".$image_id.$imgVars["image_type"]."' WHERE image_id = '".$image_id."'";
    if (!(@ mysql_query ($query, $connection)))
        die("Your mysql error routine here.");
}

session_unregister("formVars");
session_unregister("fehler");

header('Location: danke.php');
exit();

?>

テストせずに元のファイルから翻訳してトリミングしたため、このコードにはタイプミスや脱落がある可能性があります。

于 2012-04-14T19:48:45.567 に答える
-1

まず第一に:mysql_real_escape_stringデータベースに値を挿入するときは常に使用します。

それで :

$query = "INSERT INTO `Image` (`ImageId`, `ImageFile`) 
          VALUES ('".mysql_real_escape_string($_FILES["fileImage"]["tmp_name"])."','".
                     mysql_real_escape_string($_FILES["fileImage"]["name"])."'
          );";
于 2012-04-14T18:54:12.130 に答える