It is not a wise idea to save pictures in the database. Most of us save the pictures to the server, and then save the picture address to the database. In this way, we only need to read the picture address every time to display it, but I will introduce it below. Solution to the problem of saving a picture to mysql database.
The code is as follows |
Copy code |
代码如下 |
复制代码 |
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') ;");
|
require 'class/db.php';
$fileName = "a1.jpg";
$fp = fopen($fileName, "r");
代码如下 |
复制代码 |
$img = fread($fp, filesize($fileName));
$img = addslashes($img)
|
$img = fread($fp, filesize($fileName));
fclose($fp);
$db->execute("insert db2.testimg (`img`) values ('$img') ;");
|
Report error
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?' ^ W Z4in??T春??????U?湹?' at line 1
The code is as follows |
Copy code |
$img = fread($fp, filesize($fileName));
$img = addslashes($img)
|
Continue to report errors
For various searches, the results in Baidu are all addslashes, or there are no addslashes at all. What nonsense
base64_decode
$img = base64_encode($img);
Insertion successful. Image file 17.0k
Come out and perform base64_decode, the display is normal
Find a hexadecimal method
代码如下 |
复制代码 |
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);
|
$img = bin2hex($img);
Effective, the output does not need to be decrypted. The size of the database stored is 25K. It's even more deceptive than base64.
Look again.
Later, later. I found that the image files uploaded directly by phpmyadmin can be smaller than base64. File 12.8k
Turn over phpmyadmin source code
Common.lib.php file 183 has a magical function
The code is as follows |
Copy code |
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):
后台处理(upimage.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 " 插入成功!
显示图片";
else
echo "插入失败!";
mysql_close();
}else
echo "请先选择图片!
点此返回";
} else
echo "请先选择图片!
点此返回";
?>
|
代码如下 |
复制代码 |
//向数据库中插入图片
$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 " 插入成功!
显示图片";
else
echo "插入失败!";
mysql_close();
}else
echo "请先选择图片!
点此返回";
} else
echo "请先选择图片!
点此返回";
?>
|
代码如下 |
复制代码 |
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();
?>
|
显示图片(disimage.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();
?>
|
Conclusion
PMA_sqlAddslashes is easy to use. The file size is 12.8k and the same size as the original image
bin2hex hexadecimal useful file 25K
base64_encode is easy to use, the output file requires base64_decode 17K
addslashes is not easy to use, continue to report errors (note: addslashes is easy to use on some windows machines)
http://www.bkjia.com/PHPjc/630680.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/630680.htmlTechArticleIt is not a wise idea to save pictures in the database. Most of us save the pictures to the server and then save the picture address. to the database, so that we only need to read the image address every time...