好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php图片保存入mysql数据库失败解决办法 - php高级应

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高级应的详细内容...

  阅读:35次