存储到数据库中 - 问题

时间:2013-02-27 09:12:10

标签: php mysql image pdo

我目前正在处理图像上传脚本,但是在尝试将图像的详细信息存储到数据库时,我遇到了一个小问题。 上传表单抓取图像,检查其详细信息并获取图像的扩展名。这样可以正常工作,但不会将图像路径存储到数据库中。

这是相关代码的一部分:

        $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;

有什么想法阻止它保存到数据库?

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

您正在将SQL字符串注入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的字符串插值混淆({{1} })。同样,你应该得到一个例外,因为你绑定了一个不存在的参数: - ?

此外,您同时拥有$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 );

答案 2 :(得分:0)

你不需要像'$ newfile'这样的文件路径,即。

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

值得一试?