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。其中一个可能是错字。

你需要替换这个:

$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 回答