Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 存储到数据库-问题_Php_Mysql_Image_Pdo - Fatal编程技术网

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'";