jiangcat8301 2020-04-05 21:42 采纳率: 0%
浏览 130
已结题

用PHP给MySQL插入一段BLOG产生Fatal Error且没有任何提示,为啥?

如题,没有任何错误提示。尝试过用statment和直接query的方式,都无效……

// 我自己的文件函数,大概类似file_get_contents()
$fdata = $SYS->FileIO->file_read($_FILES['mediafile']['tmp_name']);

// 建立一个statement,$DB也是自己写的类,反正_CONNECTER就是mysqli实例了
$stmt = mysqli_prepare($DB->_CONNECTER, "INSERT INTO filedata (checksum, filesize, fileext, uploadtime, filedata) VALUES (?, ?, ?, ?, ?)");

// 绑定变量
mysqli_stmt_bind_param($stmt, "sissb", $checksum, $_FILES['mediafile']['size'], $fileext, date('Y-m-d H:i:s'), $DB->_CONNECTER->real_escape_string($fdata));

执行
mysqli_stmt_execute($stmt);

关闭statement
mysqli_stmt_close($stmt);

然后就甩给我一个500错误。看PHP的error log没有任何详细提示,完整log就是这样:

[Sun Apr 05 21:15:17 2020] [error] [client 111.196.2.224] PHP Fatal error: Query Errors:\nINSERT INTO GDMN_filedata (checksum, filesize, fileext, uploadtime, filedata) VALUES ('fcbb8d2c6bd3561d54ecde7289982d56', 153727193, 'mp4', '2020-04-05 21:14:34', '\0\0\0 ftypisom\0\0\x02\0isomiso2avc1mp41\0\0\0\bfree\t\x1e\xc6Lmdat\xde\x02\0Lavc58.54.100\0B \b\xc1\x188\0\0\0\x0c\x06\0\x07\x80u0\0\0\x03\0@\x80\0\0\0\b\x06\x01\x04\0\0\b\x10\x80\0\0\x0fwe\xb8\x04\x17\xff\xf3\x03a\xeb\x7f2\xbcD~\xf12\xe26\xa9\xc3T\xfe\xc4)\xceK,\x0e\xd1m\"\xcc\xf0b\xb9\xc7\xd8\x0cU\x13Z-\xdeq@m)\xc0\xa0\n\xb4\xbd\xb8\xdf\xd5\xa9\xd7\x85\xbb\xee\x06F\xb3_\xf3\xf8.\x0c\xd84n3EJ\xde\0\0\x03\0\0\x03\0\0\x03\0\x01\xb0\xbe\xa1\xa2\xb7\xc0\x06\xdf$\x06\xd4f\xd7\xda\xa1

:#\x074\xacJ\xff\xb36p\xb4\x9c\xbaX\x81\xf3\x955@\xba\xb8H\xfc\r\xdb\x9c6\x87\xdc[\xb6Ev\xe7\x89+\xdb\x90\xf5\x80\0\0\x03\0\x84=J\xd4\xaa\xb9\xd3\x15\r\x98\xf5| in /data/www/vip.gdmn/ysqj/mini/jt/includes/ob.mysqli.php on line 51, referer: https://servicewechat.com/wx2c9334cdeea730dd/devtools/page-frame.html

这是个mp4文件,我上传别的mp4都没问题,就这个文件会出错,肯定不是upload file size或max allowed packet之类的错误,比这个大的都没问题,唯独就这个。

鉴于这个情况,我也想过可能是这个文件里有特殊字符,可是real_escape_string过了,也不行。

还有别的思路吗?谢谢!

更新:因为statement在strict模式只接受变量,所以修改了一下,顺便尝试了一下oo方式:

$stmt = $DB->_CONNECTER->prepare("INSERT INTO ".TABLE_COMMON_PREFIX."filedata (checksum, filesize, fileext, uploadtime, filedata) VALUES (?, ?, ?, ?, ?)");
                $tdd = date('Y-m-d H:i:s',TIMENOW);
                $fdata = $DB->get_blob_string($fdata);
                $stmt->bind_param("sissb", $checksum, $_FILES['mediafile']['size'], $fileext, $tdd, $fdata);
//              $stmt->send_long_data(4, $DB->get_blob_string($fdata));
                $stmt->execute();
                $stmt->close();

然后神奇的事情发生了:不报错了!然鹅,整行数据里,只有blob那列没有任何数据,也不是NULL!我裂开了……

进一步更新测试结果:
发现同样的代码,我单独写了个php文件,在shell里用命令行执行就没问题。
php -f tt.php

<?php

$mysqli = new mysqli("localhost", "user", "****", "dbname");

$mysqli->query("SET character set 'utf8'");
$mysqli->query("SET NAMES 'utf8'");

$fsize = filesize('15-16.mp4');
$checksum = md5_file('15-16.mp4');
$tdd = date('Y-m-d H:i:s',time());

echo "filesize = $fsize / checksum = $checksum\n";

$fdata = $mysqli->real_escape_string(file_get_contents('15-16.mp4'));

$mysqli->query("INSERT INTO GDMN_filedata (checksum, filesize, fileext, uploadtime, filedata) VALUES ('$checksum', $fsize, 'mp4', '$tdd', '".$fda
ta."')");

$mysqli->close();

echo "done\n";

?>

这段代码放到我之前的php脚本中,执行也成功,apache也返回了200,但是数据库里什么都没有,根本没有这条新记录。难道是apache的问题?

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-04-06 13:50
    关注

    看看是不是文件过大,过大的文件可能导致插入超时或者拼接出来的sql超长,或者超过你的 blob 字段的大小。

    评论

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办