当前位置:首页 » 编程语言 » phpbind

phpbind

发布时间: 2022-07-26 13:43:00

Ⅰ thinkphp的bind方法可以绑定一个条件吗

这是防止thinkPHP框架里的I方法过滤不全而设置的。以下是我对于bind的理解:例如:$bind[':name']="abc\'or1=1'";//这是注入输入的信息;$where['name']=":name";$User=M('user');$User->where($where)->bind($bind)->select();my

Ⅱ thinkphp3.2 参数绑定是什么意思

这是防止thinkPHP框架里的I方法过滤不全而设置的。
以下是我对于bind的理解:
例如:
$bind[':name']="abc \' or 1 =1 '";//这是注入输入的信息;
$where['name']=": name";
$User=M('user');
$User->where($where)->bind($bind)->select();
mysql语句输出为 :select * from user where name="abc or 1 =1 '";
bind会用户传过来的特殊非法字符给再次过滤。
现在Tp框架里只要设置了

'DB_BIND_PARAM' => true
引用TP例子
然后,我们在使用
$Model = M('User');
$Model->name = 'thinkphp';
$Model->email = '[email protected]';
$Model->add();

会自动对写入的数据进行参数绑定操作。其操作等效于:
$Model = M('User');
$Model->name = ':name';
$Model->email = ':email';
$bind[':name'] = 'thinkphp';
$bind[':email'] = '[email protected]';
$Model->bind($bind)->add();

Ⅲ php socket_bind error 10049如何解决

查看错误信息

//绑定到socket端口
if(($ret=socket_bind($sock,$address,$port))<0)
{
echo "socket_bind() failed: reason:".socket_strerror($ret)."\n";
}

Ⅳ php怎么结合websocket实现网络聊天

php有可用的websocket库,不需要php-fpm。
目前比较成熟的有swoole(swoole.com),和workman(workman.net)
swoole是c写的php扩展, 效率比nodejs还要高,workman是纯php实现,两者都号称可以实现并发百万TCP连接。
给你个例子:
这个要通过cmd运行的 具体带的参数有点忘记了
<?php
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();

//创建一个socket连接 设置参数 绑定 监听 并且返回
$master = WebSocket("localhost",12345);

//标示是否已经进行过握手了
$is_shaked = false;

//是否已经关闭
$is_closed = true;

//将socket变为一个可用的socket

while(true){
//如果是关闭状态并且是没有握手的话 则创建一个可用的socket(貌似第二个条件可以去除)
if($is_closed && !$is_shaked){
if(($sock = socket_accept($master)) < 0){
echo "socket_accept() failed: reason: " . socket_strerror($sock) . "\n";
}

//将关闭状态修改为false
$is_closed = false;
}

//开始进行数据处理
process($sock);
}

//处理请求的函数
function process($socket){
//先从获取到全局变量
global $is_closed, $is_shaked;

//从socket中获取数据
$buffer = socket_read($socket,2048);

//如果buffer返回值为false并且已经握手的话 则断开连接
if(!$buffer && $is_shaked){
disconnect($socket);
}else{
//如果没有握手的话则握手 并且修改握手状态
if($is_shaked == false){
$return_str = dohandshake($buffer);
$is_shaked = true;
}else{
//如果已经握手的话则送入deal函数中进行相应处理
$data_str = decode($buffer); //解析出来的从前端送来的内容
console($data_str);
$return_str = encode(deal($socket, $data_str));
//$return_str = encode($data_str);
}

//将应该返回的字符串写入socket返回
socket_write($socket,$return_str,strlen($return_str));
}
}

function deal($socket, $msgObj){
$obj = json_decode($msgObj);
foreach($obj as $key=>$value){
if($key == 'close'){
disconnect($socket);
console('close success');
return 'close success';
}else if($key == 'msg'){
console($value."\n");
return $value;
}
}
}

//获取头部信息
function getheaders($req){
$r=$h=$o=null;
if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; }
if(preg_match("/Host: (.*)\r\n/" ,$req,$match)){ $h=$match[1]; }
if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; }
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; }
if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; }
return array($r,$h,$o,$key,$data);
}

function WebSocket($address,$port){
$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed");
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed");
socket_bind($master, $address, $port) or die("socket_bind() failed");
socket_listen($master,20) or die("socket_listen() failed");
echo "Server Started : ".date('Y-m-d H:i:s')."\n";
echo "Master socket : ".$master."\n";
echo "Listening on : ".$address." port ".$port."\n\n";
return $master;
}

function dohandshake($buffer){
list($resource,$host,$origin,$key,$data) = getheaders($buffer);
echo "resource is $resource\n";
echo "origin is $origin\n";
echo "host is $host\n";
echo "key is $key\n\n";

$response_key = base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));

$return_str = "HTTP/1.1 101 Switching Protocols\r\n".
"Upgrade: websocket\r\n".
"Connection: Upgrade\r\n".
"Sec-WebSocket-Accept: $response_key\r\n\r\n";
return $return_str;
}

function console($msg){
$msg = transToGBK($msg);
echo "$msg\n";
return $msg;
}

function decode($msg="") {
$mask = array();
$data = "";
$msg = unpack("H*",$msg);

$head = substr($msg[1],0,2);

if (hexdec($head{1}) === 8){
$data = false;
} else if (hexdec($head{1}) === 1){
$mask[] = hexdec(substr($msg[1],4,2));
$mask[] = hexdec(substr($msg[1],6,2));
$mask[] = hexdec(substr($msg[1],8,2));
$mask[] = hexdec(substr($msg[1],10,2));

$s = 12;
$e = strlen($msg[1])-2;
$n = 0;
for ($i= $s; $i<= $e; $i+= 2){
$data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
$n++;
}
}

return $data;
}

function encode($msg=""){
$frame = array();
$frame[0] = "81";
$msg .= ' is ok';
$len = strlen($msg);
$frame[1] = $len<16?"0".dechex($len):dechex($len);
$frame[2] = ord_hex($msg);
$data = implode("",$frame);
return pack("H*", $data);
}

function transToGBK($s){//UTF8->GBK
//echo $s;
return iconv("UTF-8", "GBK", $s);
return $s;
}

function ord_hex($data){
$msg = "";
$l = strlen($data);

for ($i=0; $i<$l; $i++){
//ord是返回字符串第一个字符的ascii值
//dechex把十进制转换为十六进制
$msg .= dechex(ord($data{$i}));
}

return $msg;
}

function disconnect($socket){
global $is_shaked, $is_closed;
$is_shaked = false;
$is_closed = true;
socket_close($socket);
}
?>

Ⅳ php pdo中PDOStatement 类的bindParam和bindValue方法的区别

在PDOStatement 类中两种方法的具体说明如下

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )

区别1:bindParam是绑定一个参数到指定的变量名,bindValue则是把一个值绑定到一个参数
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$id = 1;$st->bindParam(1,$id,PDO::PARAM_INT);//$st->bindValue(1,$id,PDO::PARAM_INT);
在上述代码中,不管是bindParam或者bindValue,都能够正常执行,但是如果换成如下代码$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$st->bindParam(1,1,PDO::PARAM_INT);//$st->bindValue(1,1,PDO::PARAM_INT);

bindParam就会报如下错误,但是bindValue却可以正常执行
Fatal error: Cannot pass parameter 2 by reference
总结:bindParam第二个参数有且只能是一个变量名, 不能是一个具体的值,bindValue既可以绑定一个变量名,又可以绑定一个值

区别2:不同于 PDOStatement::bindValue(),PDOStatement::bindParam()中的变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$id = 1;$st->bindParam(1,$id,PDO::PARAM_INT);$id = 2;$st->execute();$rs = $st->fetchAll();print_r($rs);
首先给$id赋值为1,bindParam绑定变量,在execute前,更改$id为2,然后进行执行操作,此时获得的结果集是当id=2的时候的查询结果,并非是id为1时的查询结果,这就是变量作为引用的解释,在execute之前,我们可以对此变量进行替换,而执行execute操作时候代入的变量值,是该变量最后一次更改的值。$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('select * from tabletest where id = ?');$id = 1;$st->bindValue(1,$id,PDO::PARAM_INT);$id = 2;$st->execute();$rs = $st->fetchAll();print_r($rs);

而bindValue则不同,在使用bindValue绑定变量后,即使在执行execute之前改变了该变量的值,那么结果也不会变。例如上例中即使我们把$id改为了2,但是最后执行的结果仍然会输出$id
=1时候的结果,因为bindValue绑定的并非是变量的引用,不会随着变量的更改而更改。
虽然两者都能完成sql参数的绑定,但是两者仍然有区别,在实际应用中,我们应该选择适合我们的,下面举一个bindParam使用不当的例子
假设有一个数据表有整形id和字符串型name两个字段,有一数组数据$params = array(1,'张三')准备使用预处理进行插入,具体代码如下
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass');$st = $db->prepare('insert into tabletest(id,name) values(?,?)');$params = array(1,'张三');foreach($params as $k => $v){ $index = $k + 1; $st->bindParam($index,$v);}$st->execute();
正常情况被执行的sql语句应该是insert into tabletest(id,name) values(1,'张三');
其实真正执行的sql语句却是insert into tabletest(id,name) values('男','男');

究其原因就是bindParam中的变量作为了引用被绑定,因此最后每个字段插入的数值都变成了最后一个字段的值,而此时我们使用bindValue就不会出现这种问题了。此例中还有一点需要说明的是如果使用的是问号占位符和索引数组结合,特别需要注意bindValue的参数标识符(该方法的第一个参数),索引数组默认从0开始,而bindValue的参数标识符是以1开始,如果直接套入索引数组的0下标,那么程序就会报错,使用的时候一定需要注意。

Ⅵ php 写入数据库时Call to a member function bind_param() on a non-object,急,求解

依 Call to a member function bind_param() on a non-object 是因为$regin>mysqli_stmt 这个对象错误了, 也就是$regin->mysqli->prepare($sql);在这一句返回的不是statement对象, 而是prepare时发生错误返回了false, 所以下面那句就会接着出错, 你可以试试debug输出下执行prepare时发生的错误, 可以用mysqli_error($link)之类的方法输出错误的原因, $link 就是你连接mysqli的资源, 或者一般有数据库错误之类的会有日志记录, 看看你服务器的mysql有没有开启日志记录, 然后找到日志里面查看数据库报错原因

Ⅶ index.phpaction=bind是什么意思修改静态怎么执行

你的文件可以运行啊,我已经在本地测试过了,没发现什么问题
另外,你说的通过aaa.php?action=bind查看源文件,保存源码 得到aaa.htm已经和参数无关了,这个已经是经服务器运行后产生的文件了。

Ⅷ php socket 如何实现非阻塞

关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的;我打个很简单的比方,如果你调用socket send函数时;
如果是阻塞模式下:
send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小,send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据到剩余空间里
如果是非阻塞模式下:
在调用socket send函数时,如果能写到socket缓冲区时,就写数据并返回实际写的字节数目,当然这个返回的实际值可能比你所要写的数据长度要小些(On nonblocking stream oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the client and server computers),如果不可写的话,就直接返回SOCKET_ERROR了,所以没有等待的过程。。
经过上面的介绍后,下面介绍如何设置socket的非阻塞模式:
当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式。
//-------------------------
// Set the socket I/O mode: In this case FIONBIO
// enables or disables the blocking mode for the
// socket based on the numerical value of iMode.
// If iMode = 0, blocking is enabled;
// If iMode != 0, non-blocking mode is enabled.
u_long iMode = 1; //non-blocking mode is enabled.
ioctlsocket(m_socket, FIONBIO, &iMode); //设置为非阻塞模式

套接字设置为非阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。大多数情况下,这些函数调用都会调用“失败”,并返回WSAEWOULDBLOCK错误代码。说明请求的操作在调用期间内没有时间完成。通常,应用程序需要重复调用该函数,直到获得成功返回代码。 不同的Windows Sockets API函数,在调用失败时返回的WSAEWOULDBLOCK错误代码具有不同的含义
需要说明的是并非所有的 Windows Sockets API 在非阻塞模式下调用,都会返回 WSAEWOULDBLOCK 错误。例如,以非阻塞模式的套接字为参数调用 bind() 函数时,就不会返回该错误代码。当然,在调用 WSAStartup() 函数时更不会返回该错误代码,因为该函数是应用程序第一调用的函数,当然不会返回这样的错误代码。
要将套接字设置为非阻塞模式,除了使用 ioctlsocket() 函数之外,还可以使用 WSAAsyncselect() 和 WSAEventselect() 函数。当调用该函数时,套接字会自动地设置为非阻塞方式:

Ⅸ 如何架设PHP服务器

【一】首先下载软件:
(apache) 我用的是在华军软件园下载的apache_1.3.26-win32-x86-no_src!!
(jdk!) 在首页上面就有连接。
(php4) 不用多说了code-labs上面就有也可以去php的官方网站看看!!
(iasp) 最重要的一个软件了——————————————————————————————————
【二】安装apache
1、双击apache的安装文件,和普通windows程序安装一样,一路点“next”就可以。
2、安装程序要求你输入你的network domain(网络域名:形如xxx.com);server domain(服务器域名:形www.xxx.com)和网站管理员的e-mail。有的话就按实填写,个人用户若没有的话可以按格式随便填一下。
3、到了选择安装路径,本人强烈建议你将安装路径改为“c:\”,因为这样可以省去好多的配置麻烦。 4、一路“next”直至“finish”。安装就结束了。
这时,你的apache已经启动了,你可以在ie地址栏里输入:http://localhost/或http://127.0.0.1看看。在“管理工具”的“服务”项中,也可以找到apache服务的身影了,以后apache就可以作为一项windows2000服务,随着机器的启动而运行了!
------------------------------------------------------------------------------
【三】配置apache
打开配置文件主要修改的项目是:
(1)、查找documentroot。这个语句指定你的网站路径,也就是你主页放置的目录。你可以使用默认的,也可以自己指定一个,但记住,这句末尾不要加“/”。
(2)、寻找到directoryindex。这就是你站点第一个显示的主页,在index.html的后面加入index.htm index.php index.php3 index.cgi index.pl index.asp等等。注意,每种类型之间都要留一空格!
(3)、特别说明一点就是port(端口号),如果没安装iis的话,就保持80不要变,否则,就要改一下(因为iis的web服务占据了80),可以改成81等等,或者干脆改iis的默认端口号!随你高兴。
(4).#bindaddress * 改为 bindaddress 127.0.0.1(用记事本打开/然后点编辑/查找)
其他都是以后深入使用是才要配置的项目了!安装完毕后运行http://localhost/
就可以看见apache的帮助文件了!
-----------------------------------------------------------------------------
【四】安装xxx(注意这个最主要的了)(关闭apache服务)
(1)、下面安装php首先安装php到c:\php4 (别改路径了!否则以后的配置....哼哼)我用的是php的4.0.2版,
(2)、接下来就要拷贝msvcrt.dll到c:\winnt\system32\下面系统就回提示所文件正在被windows使用了,不要紧正常现象!覆盖任何原有文件。
(3)、把 c:\php.ini-dist改名为php.ini,拷贝到c:\winnt下,
(4)、好了现在打开apache的配置文件httpd.conf增加下面的语句:(随便什么地方都可以,但要单独成行)
scriptalias /php4/ "c:/php4/"
addtype application/x-httpd-php4 .php
addtype application/x-httpd-php4 .php3
addtype application/x-httpd-php4 .php4
action application/x-httpd-php4 "/php4/php.exe"
directoryindex index.html
directoryindex index.htm
directoryindex index.php
directoryindex index.php3
directoryindex index.php4
directoryindex index.asp
(5)、接下来修改php.ini文件
找到windows extensions项:增加
extension_dir = c:\php4

extension=php_zlib.dll

extension =php_ldap.dll

extension =php_zlib.dll

extension =php_calendar.dll

extension =php_exif.dll

extension =php_ftp.dll

extension =php_mssql70.dll (这一项不要加,没有mssql7.0呀)

extension =php_imap.dll
■ok存盘ko■
在你的documentroot的目录下建立test.php文件
<?phpinfo();?>
ok看见php的测试页面了!!至此php的配置已经完成了!
下面安装jdk也是进行默认安装就可以了!之后在windows的环境变量里面增加path变量值c:\j2sdk*\bin(*:不同版本的安装路径名不同)
好了下面安装iasp使用默认安装就可以了!在安装过程后软件会提示你进行web server的设置首先选择:
instant asp native servlet surport 选项接下来选择apache server
之后要求你选择apche的版本号和httpd.conf的路径选择好后系统自动进行配置如果一切顺利就可以测试了!!
建立test.asp
<%response.write("hell world!")%>
现在运行http://localhost/test.asp,看到helloworld!好了一切搞定有可以使用apache了!!!
------------------------------------------------------------------------
【五】、上面说到了windows+apache+php+asp的运行环境了今天来说说在这个基础上使apache也可以支持jsp的运行。
1:所需软件resin(resin2.1.4)resin http://www.caochu.com
下面说说怎么安装:
resin在下载后是.zip文件只要简单的解压缩到指定的目录就可以了这里我使用的是c:\resin-ee-2.1.4 利用命令 c:\resin-ee-2.1.4\bin\httpd.exe -install(remove)将resin作为win2000的一个service
ok!下面找到win2000的环境变量"控制面板-->系统-->高级-->环境变量“
增加变量"resin_home"变量值"c:\resin-ee-2.1.4"如果你已经安装了 jdk那么就不需要设置什么了!没有的话就看看的我的上一篇文章!!!ok向下~~
现在修改apache的设置文件httpd.conf假如下面的代码:
loadmole caucho_mole c:/resin-ee-2.1.4/libexec/apache-1.3/mod_caucho.dll
addmole mod_caucho.c

Ⅹ 关于thinkphp5中的define(BIND_MODULE)在哪个文件

BIND_MODULE是TP3中使用,在thinkPHP5.0已经没有这个概念了。你可以使用路由来绑定。

热点内容
hypixel手机国际版服务器ip 发布:2025-01-25 09:14:36 浏览:598
荒岛求生安卓怎么下载 发布:2025-01-25 09:09:31 浏览:209
java中io流 发布:2025-01-25 09:02:54 浏览:878
华为高斯数据库 发布:2025-01-25 08:55:38 浏览:31
php是动态语言 发布:2025-01-25 08:45:44 浏览:67
服务器关闭了电脑网络还能用 发布:2025-01-25 08:22:28 浏览:588
热血航线的登录密码在哪里可以看 发布:2025-01-25 08:22:27 浏览:770
5系怎么选择配置 发布:2025-01-25 08:22:18 浏览:843
pythonscipy 发布:2025-01-25 08:18:52 浏览:419
恕瑞玛服务器地址 发布:2025-01-25 08:18:51 浏览:802