phpbind
Ⅰ 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已經沒有這個概念了。你可以使用路由來綁定。