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') ;" );报错:
代码如下:
$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 ); } //开源代码phpfensi测试数据 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图片保存入mysql数据库失败解决办法 - php高级应的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30483