php将图片保存入mysql数据库失败的解决方法


Posted in PHP onDecember 27, 2014

本文实例分析了php将图片保存入mysql数据库失败的解决方法。分享给大家供大家参考。具体分析如下:

图片保存数据库并不是一个明智的做法,我们多半是把图片保存到服务器,然后把图片地址保存到数据库,这样我们每次只要读出图片地址就可以显示了,但下面我还是来介绍一个图片保存到mysql数据库的问题解决办法,代码如下:

require 'class/db.php'; 

$fileName = "a1.jpg"; 

$fp = fopen($fileName, "r"); 

$img = fread($fp, filesize($fileName)); 

fclose($fp); 

 

$db->execute("insert db2.testimg (`img`) values ('$img') ;");

报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`?绶q?仳!????1丶>,Mo?'^WZ4in??T春??????U?楹\?' at line 1

代码如下:

$img = fread($fp, filesize($fileName));

$img = addslashes($img)

继续报错,各种搜索,百度里的结果都是addslashes,要不就是addslashes也没有的,真是扯淡啊.

base64_decode

$img = base64_encode($img);

插入成功,图片文件17.0k,出来进行base64_decode,显示正常,找到个16进制的办法:

$img = bin2hex($img);

有效,输出不用解密,存入数据库很大 25K,比base64还坑爹呢,再找,后来,后来,发现phpmyadmin直接上传的图片文件可以用文件比base64的小,文件12.8k.

翻phpmyadmin 源代码,common.lib.php文件183有个神奇的函数,代码如下:

function PMA_sqlAddslashes($a_string = '', $is_like = false, $crlf = false, $php_code = false) 

{ 

    if ($is_like) { 

        $a_string = str_replace('\', '\\\\', $a_string); 

    } else { 

        $a_string = str_replace('\', '\\', $a_string); 

    } 

 

    if ($crlf) { 

        $a_string = str_replace("n", 'n', $a_string); 

        $a_string = str_replace("r", 'r', $a_string); 

        $a_string = str_replace("t", 't', $a_string); 

    }

 

    if ($php_code) { 

        $a_string = str_replace(''', '\'', $a_string); 

    } else { 

        $a_string = str_replace(''', '''', $a_string); 

    } 

 

    return $a_string; 

} // end of the 'PMA_sqlAddslashes()' function$img = PMA_sqlAddslashes($img);

文件大小12.8K 和phpmyadmin的一样大.

例,前台image.html,代码如下:

<html> 

<head> 

  <title>上传图片</title> 

</head> 

 

<body> 

<form method="post" action="upimage.php" enctype="multipart/form-data"> 

 <input type="hidden" value="204800" name="MAX_FILE_SIZE"/> 

 File: <input type="file" name="imgfile" /> 

 <input type="submit" value="OK" name="submitbtn" style="width:100px;height:23px"/></center> 

</form> 

</body> 

</html>

后台处理upimage.php代码如下:
<?php 

 //向数据库中插入图片 

 $imgfile=$_FILES['imgfile']; 

 $submitbtn=$_POST['submitbtn']; 

 if($submitbtn=='OK' and is_array($imgfile)){ 

 $name=$imgfile['name'];  //取得图片名称 

 $type=$imgfile['type']; //取得图片类型 

 $size=$imgfile['size'];  //取得图片长度 

 $tmpfile=$imgfile['tmp_name'];  //图片上传上来到临时文件的路径 

 if($tmpfile and is_uploaded_file($tmpfile)){  //判断上传文件是否为空,文件是不是上传的文件 

  //读取图片流 

  $file=fopen($tmpfile,"rb"); 

  $imgdata=bin2hex(fread($file,$size));  //bin2hex()将二进制数据转换成十六进制表示 

  fclose($file); 

 

  $mysqli=mysql_connect("localhost","root","123456″);  //连接数据库函数 

  mysql_select_db("test");  //选择数据库 

  //插入出数据库语句,图片数据前要加上0x,用于表示16进制数 

  if(mysql_query("insert into images(name,type,image) values('".$name."','".$type."',0x".$imgdata.")")) 

   echo "<center>插入成功!<br><br><a href='disimage.php'>显示图片</a></center>"; 

  else 

   echo "<center>插入失败!</center>"; 

  mysql_close(); 

 }else 

 echo "<center>请先选择图片!<br><br><a href='image.html'>点此返回</a></center>"; 

} else 

 echo "<center>请先选择图片!<br><br><a href='image.html'>点此返回</a></center>"; 

?>

显示图片disimage.php,代码如下:
<?php 

 mysql_connect("localhost","root","123456″); 

 mysql_select_db("test"); 

 //显示最新插入的那张图片 

 $result=mysql_query("select image from images where id=(select max(id) from images)"); 

 $row=mysql_fetch_object($result); 

 header("Content-Type:image/pjpeg"); 

 echo $row->image; 

 mysql_close(); 

?>

结论:

PMA_sqlAddslashes好用 文件12.8k 和原来图片一样大

bin2hex 16进制 好用文件25K

base64_encode 好用,出来的文件需要base64_decode 17K

addslashes 不好用,继续报错,注明,在某些windows机器上addslashes好用.

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
简单的移动设备检测PHP脚本代码
Feb 19 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
浅谈php提交form表单
Jul 01 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
php HTML无刷新提交表单
Apr 05 PHP
微信公众平台DEMO(PHP)
May 04 PHP
php使用自定义函数实现汉字分割替换功能示例
Jan 30 PHP
PHP遍历目录文件的常用方法小结
Feb 03 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 13 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 PHP
php下pdo的mysql事务处理用法实例
Dec 27 #PHP
php5.3不能连接mssql数据库的解决方法
Dec 27 #PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
Dec 26 #PHP
php+jQuery.uploadify实现文件上传教程
Dec 26 #PHP
php实现mysql备份恢复分卷处理的方法
Dec 26 #PHP
为PHP5.4开启Zend OPCode缓存
Dec 26 #PHP
Yii中使用PHPExcel导出Excel的方法
Dec 26 #PHP
You might like
php 团购折扣计算公式
2011/11/24 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
js常用函数 不错
2006/09/08 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
Javascript缓存API
2016/06/14 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
python3 pygame实现接小球游戏
2019/05/14 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
Jar包的作用是什么
2014/03/30 面试题
Java平台和其他软件平台有什么不同
2015/06/05 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
集体婚礼证婚词
2014/01/13 职场文书
检举信的格式及范文
2014/04/04 职场文书
股份合作协议书
2014/09/10 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书
思想品德评语大全
2014/12/31 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
离职告别感言
2015/08/04 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
检讨书之工作不认真
2019/08/14 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python
Android存储中最基本的文件存储方式
2022/04/30 Java/Android