1

現在、画像のアップロードスクリプトに取り組んでいますが、画像の詳細をデータベースに保存しようとすると、わずかな問題が発生します。アップロードフォームは画像を取得し、その詳細を確認して、画像の拡張子を取得します。これは正常に機能しますが、画像パスはデータベースに保存されません。

これは問題のコードの一部です:

        $file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn;
        echo $file_path;

        try {
            $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
            $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $sql = "UPDATE user SET img=$file_path WHERE userID = $username";
            $stmt = $con->prepare( $sql );
            $stmt->bindValue( "file_path", $this->file_path, PDO::PARAM_STR );
            $stmt->execute();

            if ( $stmt->rowCount() > 0 ) {
            echo ('Complete');
            }
            else {
            echo ('Error');
            }
            }catch( PDOException $e ) {
            return $e->getMessage();
        }
 }

今、私が「echo$file_path;」を持っている理由 値が正しく渡されていることを確認する必要がありました。

現在、画像がアップロードされた場合、これをエコーアウトします:images / profile / f1b4edb293.jpg

したがって、すべてが正常に機能しており、実際に保存する時点で失敗します。

さらにテストするために、file_path変数から文字列とパスの詳細を削除し、そこにダミー値を追加しました。例:

    $test = "test";
    $file_path = $test;

そして確かに、それは機能し、データベースにテストを挿入しました。

そのため、この形式に問題があると私は信じています。

        $file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn;

そのどの部分がデータベースへの保存を妨げているかについてのアイデアはありますか?

4

3 に答える 3

1

このコードを使用する

$sql = "UPDATE user SET img=:file_path WHERE userID = :username";
$stmt = $con->prepare( $sql );
$stmt->bindValue( ":file_path", $file_path, PDO::PARAM_STR );
$stmt->bindValue( ":username", $username, PDO::PARAM_STR );
$stmt->execute();
于 2013-02-27T09:15:27.017 に答える
1

PHP文字列をSQLコードに挿入し、引用符で囲まれていないSQL文字列を生成します(そしてスクリプトをSQLインジェクションに開きます)。

$file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn;
$sql = "UPDATE user SET img=$file_path WHERE userID = $username";

の場合var_dump($sql)、無効なSQLを生成していることがわかります。(なぜ例外がスローされないのだろうか。)

ただし、これは後でわかります。

$stmt->bindValue( "file_path", $this->file_path, PDO::PARAM_STR );

したがって、プリペアドステートメントを知っていると思います:file_path、プレースホルダー構文(または?)とPHPの文字列補間($file_path)を混同しています。繰り返しますが、存在しないパラメータをバインドしているため、例外が発生するはずです:-?

さらに、との両方が$file_pathあり$this->file_pathます。それらの1つはおそらくタイプミスです。

これを交換する必要があります:

$sql = "UPDATE user SET img=$file_path WHERE userID = $username";
$stmt = $con->prepare( $sql );
$stmt->bindValue( "file_path", $this->file_path, PDO::PARAM_STR );

... これとともに:

$sql = "UPDATE user SET img=:file_path WHERE userID = :username";
$stmt = $con->prepare( $sql );
$stmt->bindValue("file_path", $file_path, PDO::PARAM_STR );
$stmt->bindValue("username", $username, PDO::PARAM_STR );
于 2013-02-27T09:25:07.303 に答える
0

'$ newfile'のようなファイルパスは必要ありませんか?

 $sql = "UPDATE user SET img='$file_path' WHERE userID = '$username'";

それは試みに値します ?

于 2013-02-27T09:48:20.937 に答える