php 图片 byte数组,php – 将图像存储在PostgreSQL数据库的bytea字段中

TL; DR:

删除addslashes($data).这里多余.

双重逃避..两次

$data=fread($p,filesize($fi));

$data=addslashes($data);

$dat= pg_escape_bytea($data);

您读取数据,将其转义为字符串文字,然后将其转换为bytea八进制或十六进制转义.即使pg_escape_bytea是理智的,它也不会那样,但事实并非如此.

PHP的pg_escape_bytea似乎双重转义输出,因此可以将其插入到字符串文字中.这非常难看,但似乎没有一个替代方法不会进行双重转义,所以你似乎无法在PHP中使用参数化语句来实现bytea.你还应该为其他一切做到这一点.

在这种情况下,只需删除从文件读入的数据的addslashes行就足够了.

测试用例显示pg_escape_bytea双重转义(并且总是使用旧的,低效的八进制转义):

# oh-the-horror.php

print pg_escape_bytea("Blah binary\x00\x01\x02\x03\x04 blah");

?>

跑:

php oh-the-horror.php

结果:

Blah binary\\000\\001\\002\\003\\004 blah

看到加倍的反斜杠?那是因为它假设你要将它作为一个字符串插入到SQL中,这是一个非常低效,丑陋和非常糟糕的习惯.但是你似乎没有任何其他选择.

除此之外,这意味着:

pg_unescape_bytea(pg_escape_bytea("\x01\x02\x03"));

…产生错误的结果,因为pg_unescape_bytea实际上与pg_escape_bytea不相反.它也使得无法将pg_escape_bytea的输出作为参数提供给pg_query_params,你必须将其插入.

解码

如果你使用的是现代的PostgreSQL,它可能会默认将bytea_output设置为十六进制.这意味着如果我将数据写入bytea字段然后将其取回,它将看起来像这样:

craig=> CREATE TABLE byteademo(x bytea);

CREATE TABLE

craig=> INSERT INTO byteademo(x) VALUES ('Blah binary\\000\\001\\002\\003\\004 blah');

INSERT 0 1

craig=> SELECT * FROM byteademo ;

x

----------------------------------------------------------------------------

\x426c61682062696e6172795c3030305c3030315c3030325c3030335c30303420626c6168

(1 row)

“嗯,什么”,你可能会说?这很好,它只是PostgreSQL稍微更紧凑的bytea十六进制表示. pg_unescape_bytea将处理它并产生与输出相同的原始字节…如果你有一个现代的PHP和libpq.在旧版本中,您将获得垃圾,并且需要设置bytea_output以逃避pg_unescape_bytea来处理它.

你应该做什么

使用PDO.

它对bytea有理智(ish)支持.

$sth = $pdo->prepare('INSERT INTO mytable(somecol, byteacol) VALUES (:somecol, :byteacol)');

$sth->bindParam(':somecol', 'bork bork bork');

$sth->bindParam(':byteacol', $thebytes, PDO::PARAM_LOB);

$sth->execute();

看到:

您可能还想查看PostgreSQL的lob(大对象)支持,它提供了一个仍然完全事务性的流式可搜索接口.

现在,到我的肥皂盒

如果PHP在“字节字符串”和“文本字符串”类型之间有真正的区别,您甚至不需要pg_escape_bytea,因为数据库驱动程序可以为您完成.这些丑陋都不是必需的.不幸的是,PHP中没有单独的字符串和字节类型.

请尽可能使用PDO和参数化语句.

在你不能的地方,至少使用pg_query_params和参数化语句. PHP的addslashes不是替代品,它效率低,难看,并且不了解数据库特定的转义规则.如果你因为icky历史原因没有使用PDO,你仍然需要手动转义bytea,但其他一切都应该通过参数化语句.

有关pg_query_params的指导:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

页面显示其他php,php – 分页在所有其他页面上显示来自第1页的相同帖子

终于解决了这个:function my_filter_where( $where ) {global $wp_query;if (is_array($wp_query->query_vars[post_status])) {if (in_array(future,$wp_query->query_vars[post_status])) {// posts today into the future$where . " AND post_date …

oracle格式化列宽度,ORACLE日期时间的格式化参数大全

经常遇到有朋友问询关于日期时间格式化的问题(或可以通过格式化轻易解决),经过参考Oracle SQL Reference官方文档,并附上详细的应用示例综合成文,希望能够对大家学习和使用有所帮助。本篇可视为"oracle著名及非著名函数介绍"的补充…

oracle 8i漏洞渗透,一次通过Oracle8i入侵系统之旅(组图)

最近看了些有关Oracle的安全资料,看后随手做了一个渗透测试,把过程记录下来方便日后查阅.先用SuperScan4.0扫描下要测试的主机,速度很快,结果如图1所示:图 1端口 1521 是 Oracle 的 TNS Listener 默认监听的端口,通过扫描报告还可以看到Oracle的版本为8i.现在还不知道对方的操作…

linux系统安装serv u,建立第一个可用的FTP服务器

二、建立第一个可用的FTP服务器1、比如本机IP地址为“192.168.0.48”,已建立好域名“ftp.bbc.com”的相关DNS记录。2、打开Serv-U管理器。选上图的“Serv-U Administrator”,即出现“Setup Wizard”(设置向导)。此向导可以帮你轻松地完成基本设置&#x…

mat 内存分析 Linux,JVM内存分析工具MAT使用简介

# Memory Analyzer使用简介markdown格式渲染异常请阅读附件。- [Memory Analyzer使用简介](#memory-analyzer使用简介)- [MAT 简介](#mat-简介)- [安装](#安装)- [图形界面使用方式](#图形界面使用方式)- [命令行使用方式](#命令行使用方式)- [线程dump](#线程dump)- [堆dump](…

Linux配置scheme环境,用 Xcode Configuration 和 Scheme 配置项目环境

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?想象一个场景,我们正在开发一款支付系统,这个支付系统同时支持有Web版和原生的iOS APP版本。这个支付系统有三个环境:dev: 调用…

linux进入字符界面编程,MPlayer字符界面操作方法

一、启动播放时参数:在终端下敲入:./mplayer 提示各种使用帮助信息-vo 选择视频输出模式和设备(用-vo help查看列表)-ao 选择音频输出模式和设备(用-ao help查看列表)-ss 寻找指定的(多少秒或hh:mm:ss)位置-nosound 不播放声音-fs -vm -zoom …

linux怎么删web应用程序错误,Ubuntu 20.04将删除Amazon Web应用程序,但用户可另行安装...

Ubuntu 20.04将删除Amazon Web应用程序,原因就是这款应用很少有用户使用,但需要的用户也可另行安装。在过去的8年中,Amazon Web应用程序已成为Ubuntu桌面的一部分,现在,Ubuntu 20.04已决定退出。亚马逊网络启动器是在U…

linux 双网卡 debian,Debian 双网卡bond

1. 安装ifenslaveifenslave的作用是网卡的负载均衡# apt-get install ifenslave2. 修改/etc/network/interface复制代码代码如下:{rootb01 359 ~}# cat /etc/network/interfaces# This file describes the network interfaces available on your system# and how to activate t…

C++对象数组与对象指针

C对象数组 1.1数组不仅可以由简单的变量组成,而且还可以由对象组成。 1.2对象数组的初始化: A.如果构造函数只有一个参数,在初始化数组时可以在花括号里提供实参。Student stud[3]{10,18,12}; B.如果构造函数有多个参数,在初始化数组时&a…

linux下sqlmap安装教程,(转)Sqlmap官网下载与安装教程[windows/linux版本]

转自:http://www.vuln.cn/2000sqlmap的功能与强大性不必多言,方便大家下载,给大家整理了下sqlmap最新版的官网与github下载地址。官网下载地址github下载环境与安装windows系统环境安装windows下安装sqlmap需要python环境支持安装好后&#x…

C++共用数据的保护

C中往往通过使用const,来使数据在一定范围内共享又不能被随意修改。 C常对象 1.1常对象的一般形式为:A.Time const t(1,2,3);B.const Time t(1,2,3);1.2常对象的数据成员都是常变量而且必须要有初值。1.3不能调用常对象的非const型的成员函数&#xff0…

linux gcc本地链接lib文件(c静态,动态),GCC中静态连接和动态连接的区别(LINUX下)...

最近正在学习库的用法,写了最基础的libmystring.a的库(里面只有一个add函数),然后编写test程序测试add函数,用ar命令创建好libmystring.a库后,用以下命令编译静态连接的a.outgcc –static test.c –L ./ –lmystring –o a.out得到…

C++对象的动态建立和释放

1.1前面的方法是静态的&#xff0c;而在c中要动态的建立对象可以用new&#xff0c;删除对象用delete。 C对象动态建立和释放 1.1用new运算符之后&#xff0c;返回一个指向新对象的指针。Box *ptnew Box(1,2,3);1.2通过pt来访问这个对象cout << pt->height;cout <&…

linux18.04循环登陆,ubuntu18.04 循环登陆

主要原因是驱动不对&#xff0c;重新按装驱动就是了&#xff0c;按以下步骤进行&#xff1a;1、sudo apt-get remove --purge nvidia-*2、sudo apt-get autoremove3、sudo reboot重新启动后&#xff1a;sudo ubuntu-drivers autoinstallubuntu 18.04 不同桌面的切换 gdm3/light…

C++对象的赋值和复制

C对象的赋值 1.1对象之间的赋值是用“”运算符来实现的&#xff0c;“”在c中扩展为重载运算符来实现对象间的赋值。t1t2;1.2对象赋值是对数据成员的赋值&#xff0c;而不是对成员函数的赋值。因为数据成员占用内存空间&#xff0c;而成员函数只是一段共用代码。1.3类的数据成员…

linux附加重定向,关于Linux:如何将stdout和stderr重定向并附加到带有bash的文件中?...

要将stdout重定向到bash中的截断文件&#xff0c;我知道要使用&#xff1a;cmd > file.txt要重定向bash中的stdout&#xff0c;附加到一个文件&#xff0c;我知道要使用&#xff1a;cmd >> file.txt要将stdout和stderr重定向到截断的文件&#xff0c;我知道要使用&…

C++静态成员

在同类的多个对象之间实现数据共享&#xff0c;往往使用静态成员而不是全局变量。 C静态数据成员 1.1静态数据成员是一种特殊的数据成员。static int height;1.2静态数据成员可以通过类名来引用&#xff0c;也可以通过对象来引用。1.3静态数据成员不属于某一个对象&#xff0c;…

实践平台linux,关于构造Linux系统实践平台的设想

摘 要 当前虽然有很多高校将Linux课程作为本科学生的必修课&#xff0c;但是在高校中专业的Linux实验室却并未普及。在不增加机房管理员工作量以及学生可以充分体验Linux系统性能的前提下&#xff0c;本文提出了一种利用网络来实现Linux系统实践平台的构造方法&#xff0c;并且…

ndk linux 最新版本,NDK各版本下载

翻不了墙的话&#xff0c;可以用迅雷下载最新版本r20https://dl.google.com/android/repository/android-ndk-r20-windows-x86.ziphttps://dl.google.com/android/repository/android-ndk-r20-windows-x86_64.ziphttps://dl.google.com/android/repository/android-ndk-r20-dar…