我目前正在处理图像上传脚本,但是在尝试将图像的详细信息存储到数据库时,我遇到了一个小问题。 上传表单抓取图像,检查其详细信息并获取图像的扩展名。这样可以正常工作,但不会将图像路径存储到数据库中。
这是相关代码的一部分:
$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;
有什么想法阻止它保存到数据库?
答案 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'";
值得一试?