Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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 Can';t在mySQL中以blob形式存储.pdf文件_Php_Mysql_Blob - Fatal编程技术网

Php Can';t在mySQL中以blob形式存储.pdf文件

Php Can';t在mySQL中以blob形式存储.pdf文件,php,mysql,blob,Php,Mysql,Blob,因此,我尝试将PDF文件上载到mySQL blob中,插入表行,但在fileContent(mediumBlob类型)中,它始终显示为[blob 0 B],并且在下载文件时,它以0字节下载。我回显了$content,它显示了pdf文件的特殊字符 $erro = ''; $tipo = ''; if (isset($_POST['submit']) && isset($_POST['text']) && $_POST['text'] !== null &&a

因此,我尝试将PDF文件上载到mySQL blob中,插入表行,但在fileContent(mediumBlob类型)中,它始终显示为[blob 0 B],并且在下载文件时,它以0字节下载。我回显了$content,它显示了pdf文件的特殊字符

$erro = '';
$tipo = '';
if (isset($_POST['submit']) && isset($_POST['text']) && $_POST['text'] !== null && isset($_POST['userID']))
    {
        if(preg_match('/^[a-z0-9-]+$/',$_POST['text']) && strlen($_POST['text']) < 15 ) 
        {

            if (substr($_FILES['file']['name'], -3, 3) == "pdf" && $_FILES["file"]["size"] < 1000000) 
            {

              if ($_FILES["file"]["error"] > 0) 
              {
                $erro = "Problema: " . $_FILES["file"]["error"];
                $tipo = 'erro';
              } 
              else 
              {
                  $_FILES["file"]["name"] = $_POST['text'].'.pdf';
                  $erro = "Ficheiro guardado com sucesso.";
                  $tipo = 'sucesso';
               }
            }
            else 
            {
               $erro = "Apenas .PDF com menos de 10 Mb são permitidos!";
               $tipo = 'erro';
            }
        } 
        else
        {
            $erro = "Nome inválido";
            $tipo = 'erro';
        }

        if ($tipo == 'sucesso')
        {
            $content = $db->real_escape_string(file_get_contents($_FILES['file']['tmp_name']));

            if ($_FILES["file"]["size"] > 0)
            {
                $smt = $db->prepare('INSERT into uploads (userRefID,fileName,fileType,fileSize,fileContent,uploadDate) values(?,?,?,?,?,?)');
                $smt->bind_param('issibs', $_POST['userID'], $_FILES["file"]["name"], $_FILES["file"]["type"], $_FILES["file"]["size"], $content ,date(c));
                $smt->execute();
                $smt->close();
            }
        }



    }
$erro='';
$tipo='';
if(isset($\u POST['submit'])和&isset($\u POST['text'])和&$\u POST['text']!==null和&isset($\u POST['userID']))
{
如果(预匹配('/^[a-z0-9-]+$/',$后['text'])和&strlen($后['text'])<15)
{
如果(substr($\u FILES['file']['name'],-3,3)=“pdf”&&&$\u FILES[“file”][“size”]<1000000)
{
如果($\u文件[“文件”][“错误”]>0)
{
$erro=“Problema:”.$\u文件[“文件”][“错误”];
$tipo='erro';
} 
其他的
{
$\u FILES[“file”][“name”]=$\u POST['text']..pdf';
$erro=“Ficheiro guardado com成功。”;
$tipo='successo';
}
}
其他的
{
$erro=“Apenas.PDF com menos de 10 Mb圣佩尔米蒂多斯!”;
$tipo='erro';
}
} 
其他的
{
$erro=“Nome inválido”;
$tipo='erro';
}
如果($tipo=='sucesso')
{
$content=$db->real_escape_字符串(file_get_contents($_FILES['file']['tmp_name']);
如果($\u文件[“文件”][“大小”]>0)
{
$smt=$db->prepare('INSERT-into-uploads(userRefID,fileName,fileType,fileSize,fileContent,uploadDate)值(?,,,,,,,,,,,,));
$smt->bind_param('issibs'、$_POST['userID']、$_FILES[“file”][“name”]、$_FILES[“file”][“type”]、$_FILES[“file”][“size”]、$content、date(c));
$smt->execute();
$smt->close();
}
}
}
我做错了什么?

根据您的要求,您不应该直接在
bind\u param
中传递blob,而是使用
发送长数据

以下是一个示例,来自的文档:

$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp)) {
    $stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();

这个blob中大约有多少字节?MySQL设置
max\u allowed\u packet
将对此有发言权。默认情况下,它设置为16MB,因此这是您的最大查询长度。Im上载的文件有131Kb。为什么长度会超过这个值?这不是问题的根本原因,但我认为在传递内容之前,您不需要
real\u escape\u string
内容,因为您正在使用
bind\u param
为您处理此问题。我尝试了不使用它,结果相同。现在我测试了一个3Kb的PDF,同样的结果…我现在试着使用它。我得到了相同的结果[BLOB 0 B]
send\u long\u data
的第一个参数是SQL语句中的参数编号。所以这里应该是4,而不是0。