Php 存储到数据库-问题
我目前正在编写一个图像上传脚本,但是在尝试将图像的详细信息存储到数据库时遇到了一个小问题。 上载表单获取图像,检查其详细信息并获取图像的扩展名。这很好,但是它不会将图像路径存储到数据库中 这是有关守则的一部分:Php 存储到数据库-问题,php,mysql,image,pdo,Php,Mysql,Image,Pdo,我目前正在编写一个图像上传脚本,但是在尝试将图像的详细信息存储到数据库时遇到了一个小问题。 上载表单获取图像,检查其详细信息并获取图像的扩展名。这很好,但是它不会将图像路径存储到数据库中 这是有关守则的一部分: $file_path = 'images/profile/' . substr(md5(time()), 0, 10) . '.' . $file_extn; echo $file_path; try { $con
$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;
你知道是哪一部分阻止了它保存到数据库吗?使用下面的代码
$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();
将PHP字符串注入到SQL代码中,从而生成无引号的SQL字符串(并将脚本打开为SQL注入): 如果
var\u dump($sql)
,您将看到生成的sql无效。(我想知道为什么没有抛出异常。)
不过,我们稍后会看到:
$stmt->bindValue( "file_path", $this->file_path, PDO::PARAM_STR );
因此,我想您知道准备好的语句,但是您混淆了占位符语法(要么:file\u path
要么?
)和PHP的字符串插值($file\u path
)。同样,您应该得到一个异常,因为您绑定了一个不存在的参数:-
此外,您还有$file\u path
和$this->file\u 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 );
您是否不需要像“$newfile”这样的文件路径,即
$sql = "UPDATE user SET img='$file_path' WHERE userID = '$username'";
值得一试吗?试过了,但那部分效果很好。正如我所说的,如果我删除$file_path元素并在其中添加单词Test,它就会正确插入。问题似乎与“images/profile/”的格式有关。substr(md5(time()),0,10)。”$文件扩展@JPDP此行的输出是什么
'images/profile/'。substr(md5(time()),0,10)。”$文件扩展代码>。是的,没有抛出异常。运行了一个var_转储,你是对的。我更新了查询,现在它的工作魅力。我还在学习PDO,所以我的方法还不完善。感谢you@JPDP-您有return$e->getMessage()代码>在catch()
块中。你真的检查了返回值吗?
$sql = "UPDATE user SET img='$file_path' WHERE userID = '$username'";