微信小程序的js后臺只能執(zhí)行一些簡單的邏輯,遇到比較復(fù)雜的處理表單數(shù)據(jù)的功能或者網(wǎng)絡(luò)功能就需要連接服務(wù)器來遠(yuǎn)程處理,實(shí)現(xiàn)方式就是調(diào)用小程序的 wx.request() 這一接口。
目前創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、屯溪網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
request請求 就是基本的HTTP請求,可以攜帶一些表單數(shù)據(jù),交給服務(wù)器處理。
在小程序中的寫法如下:
采用php作為服務(wù)器端語言,通過WAMP等框架可以很容易地搭建環(huán)境,服務(wù)器主要完成對請求數(shù)據(jù)的處理以及結(jié)果數(shù)據(jù)的返回。
請求數(shù)據(jù)的獲取非常容易,直接訪問相應(yīng)的超全局?jǐn)?shù)組,對于GET方法而言,通過下面的方式即可:
為了方便小程序端數(shù)據(jù)的處理,結(jié)果數(shù)據(jù)仍通過json格式返回,具體在php中的簡單做法就是
這樣返回的json數(shù)據(jù)就為
其中value1,value2等變量可以設(shè)置為多維數(shù)組,這樣通過json_encode() 函數(shù)之后就可以得到相應(yīng)的嵌套的json數(shù)據(jù),從而方便處理。
通過php可以很容易地處理微信小程序的request請求,筆者是由于前一段時(shí)間需要進(jìn)行微信小程序的開發(fā),就研究了一下小程序的邏輯,然后嘗試用php進(jìn)行服務(wù)端處理,對于簡單的請求處理起來覺得還不錯(cuò),這篇文章可以作為初次接觸微信小程序的一個(gè)參考。
PHP5字符串處理函數(shù)
addcslashes — 為字符串里面的部分字符添加反斜線轉(zhuǎn)義字符
addslashes — 用指定的方式對字符串里面的字符進(jìn)行轉(zhuǎn)義
bin2hex — 將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制表示
chop — rtrim() 的別名函數(shù)
chr — 返回一個(gè)字符的ASCII碼
chunk_split — 按一定的字符長度將字符串分割成小塊
convert_cyr_string — 將斯拉夫語字符轉(zhuǎn)換為別的字符
convert_uudecode — 解密一個(gè)字符串
convert_uuencode — 加密一個(gè)字符串
count_chars — 返回一個(gè)字符串里面的字符使用信息
crc32 — 計(jì)算一個(gè)字符串的crc32多項(xiàng)式
crypt — 單向散列加密函數(shù)
echo — 用以顯示一些內(nèi)容
explode — 將一個(gè)字符串用分割符轉(zhuǎn)變?yōu)橐粩?shù)組形式
fprintf — 按照要求對數(shù)據(jù)進(jìn)行返回,并直接寫入文檔流
get_html_translation_table — 返回可以轉(zhuǎn)換的HTML實(shí)體
hebrev — 將Hebrew編碼的字符串轉(zhuǎn)換為可視的文本
hebrevc — 將Hebrew編碼的字符串轉(zhuǎn)換為可視的文本
html_entity_decode — htmlentities ()函數(shù)的反函數(shù),將HTML實(shí)體轉(zhuǎn)換為字符
htmlentities — 將字符串中一些字符轉(zhuǎn)換為HTML實(shí)體
htmlspecialchars_decode — htmlspecialchars()函數(shù)的反函數(shù),將HTML實(shí)體轉(zhuǎn)換為字符
htmlspecialchars — 將字符串中一些字符轉(zhuǎn)換為HTML實(shí)體
implode — 將數(shù)組用特定的分割符轉(zhuǎn)變?yōu)樽址?/p>
join — 將數(shù)組轉(zhuǎn)變?yōu)樽址琲mplode()函數(shù)的別名
levenshtein — 計(jì)算兩個(gè)詞的差別大小
localeconv — 獲取數(shù)字相關(guān)的格式定義
ltrim — 去除字符串左側(cè)的空白或者指定的字符
md5_file — 將一個(gè)文件進(jìn)行MD5算法加密
md5 — 將一個(gè)字符串進(jìn)行MD5算法加密
metaphone — 判斷一個(gè)字符串的發(fā)音規(guī)則
money_format — 按照參數(shù)對數(shù)字進(jìn)行格式化的輸出
nl_langinfo — 查詢語言和本地信息
nl2br — 將字符串中的換行符“n”替換成“
”
number_format — 按照參數(shù)對數(shù)字進(jìn)行格式化的輸出
ord — 將一個(gè)ASCII碼轉(zhuǎn)換為一個(gè)字符
parse_str — 把一定格式的字符串轉(zhuǎn)變?yōu)樽兞亢椭?/p>
print — 用以輸出一個(gè)單獨(dú)的值
printf — 按照要求對數(shù)據(jù)進(jìn)行顯示
quoted_printable_decode — 將一個(gè)字符串加密為一個(gè)8位的二進(jìn)制字符串
quotemeta — 對若干個(gè)特定字符進(jìn)行轉(zhuǎn)義
rtrim — 去除字符串右側(cè)的空白或者指定的字符
setlocale — 設(shè)置關(guān)于數(shù)字,日期等等的本地格式
sha1_file — 將一個(gè)文件進(jìn)行SHA1算法加密
sha1 — 將一個(gè)字符串進(jìn)行SHA1算法加密
similar_text — 比較兩個(gè)字符串,返回系統(tǒng)認(rèn)為的相似字符個(gè)數(shù)
soundex — 判斷一個(gè)字符串的發(fā)音規(guī)則
sprintf — 按照要求對數(shù)據(jù)進(jìn)行返回,但是不輸出
sscanf — 可以對字符串進(jìn)行格式化
str_ireplace — 像str_replace()函數(shù)一樣匹配和替換字符串,但是不區(qū)分大小寫
str_pad — 對字符串進(jìn)行兩側(cè)的補(bǔ)白
str_repeat — 對字符串進(jìn)行重復(fù)組合
str_replace — 匹配和替換字符串
str_rot13 — 將字符串進(jìn)行ROT13加密處理
str_shuffle — 對一個(gè)字符串里面的字符進(jìn)行隨機(jī)排序
str_split — 將一個(gè)字符串按照字符間距分割為一個(gè)數(shù)組
str_word_count — 獲取字符串里面的英文單詞信息
strcasecmp — 對字符串進(jìn)行大小比較,不區(qū)分大小寫
strchr — 通過比較返回一個(gè)字符串的部分strstr()函數(shù)的別名
strcmp — 對字符串進(jìn)行大小比較
strcoll – 根據(jù)本地設(shè)置對字符串進(jìn)行大小比較
strcspn — 返回字符連續(xù)非匹配長度的值
strip_tags — 去除一個(gè)字符串里面的HTML和PHP代碼
stripcslashes — 反轉(zhuǎn)義addcslashes()函數(shù)轉(zhuǎn)義處理過的字符串
stripos — 查找并返回首個(gè)匹配項(xiàng)的位置,匹配不區(qū)分大小寫
stripslashes — 反轉(zhuǎn)義addslashes()函數(shù)轉(zhuǎn)義處理過的字符串
stristr — 通過比較返回一個(gè)字符串的部分,比較時(shí)不區(qū)分大小寫
strlen — 獲取一個(gè)字符串的編碼長度
strnatcasecmp — 使用自然排序法對字符串進(jìn)行大小比較,不區(qū)分大小寫
strnatcmp — 使用自然排序法對字符串進(jìn)行大小比較
strncasecmp — 對字符串的前N個(gè)字符進(jìn)行大小比較,不區(qū)分大小寫
strncmp — 對字符串的前N個(gè)字符進(jìn)行大小比較
strpbrk — 通過比較返回一個(gè)字符串的部分
strpos — 查找并返回首個(gè)匹配項(xiàng)的位置
strrchr — 通過從后往前比較返回一個(gè)字符串的.部分
strrev — 將字符串里面的所有字母反向排列
strripos — 從后往前查找并返回首個(gè)匹配項(xiàng)的位置,匹配不區(qū)分大小寫
strrpos – 從后往前查找并返回首個(gè)匹配項(xiàng)的位置
strspn — 匹配并返回字符連續(xù)出現(xiàn)長度的值
strstr — 通過比較返回一個(gè)字符串的部分
strtok — 用指定的若干個(gè)字符來分割字符串
strtolower — 將字符串轉(zhuǎn)變?yōu)樾?/p>
strtoupper –將字符串轉(zhuǎn)變?yōu)榇髮?/p>
strtr — 對字符串比較替換
substr_compare — 對字符串進(jìn)行截取后的比較
substr_count — 計(jì)算字符串中某字符段的出現(xiàn)次數(shù)
substr_replace — 對字符串中的部分字符進(jìn)行替換
substr — 對字符串進(jìn)行截取
trim — 去除字符串兩邊的空白或者指定的字符
ucfirst — 將所給字符串的第一個(gè)字母轉(zhuǎn)換為大寫
ucwords — 將所給字符串的每一個(gè)英文單詞的第一個(gè)字母變成大寫
vfprintf — 按照要求對數(shù)據(jù)進(jìn)行返回,并直接寫入文檔流
vprintf — 按照要求對數(shù)據(jù)進(jìn)行顯示
vsprintf — 按照要求對數(shù)據(jù)進(jìn)行返回,但是不輸出
wordwrap — 按照一定的字符長度分割字符串
strtolower()函數(shù)把所有字符變成小寫,strtoupper()函數(shù)把所有字符變成大寫,ucfirst()函數(shù)將所給字符串的第一個(gè)字母轉(zhuǎn)換為大寫,ucwords()函數(shù)將所給字符串的每一個(gè)英文單詞的第一個(gè)字母變成大寫。ucfirst()只處理字符串的首個(gè)字符,ucwords()只處理每個(gè)單詞的首字母(以空格來界定是否是單詞,“today!Hi”、“today.Hi” 會被認(rèn)為是一個(gè)單詞),對于其余字母的大小寫狀態(tài)并不改變。 ;
php處理數(shù)據(jù)時(shí)會有一個(gè)等待時(shí)間,就是所說的超時(shí)時(shí)間,而且如果使用mysql的話,它也有一個(gè)超時(shí)時(shí)間,運(yùn)行一串代碼時(shí)間如果超過配置文件的時(shí)間,會被中斷不運(yùn)行。第一種你可以修改php配置文件timeout的運(yùn)行時(shí)間,第二你可以分批處理大量數(shù)據(jù),注意是分批處理,就OK了。
create databases handle;
create table user(
id int unsigned not null auto_increment primary key,
name varchar(8),
sex tinyint(1) default '1',
score int not null,
state tinyint(1)
);
2.向表中添加數(shù)據(jù)(不示例)
3.創(chuàng)建index.html客戶端,a.php服務(wù)端1,b.php服務(wù)端2
Index.html:
!DOCTYPE html
html lang="en"
head
meta charset="UTF-8"
title客戶端/title
/head
body
button onclick="send('a.php?state=0')"開始請求/button
div style="position: fixed;width: 500px;height: 300px;top: 100px;background: gray"
span style="color: white;font-size: 20px;"/span
/div
script type="text/javascript" src="./jquery-1.10.2.min.js"/script
script type="text/javascript"
//創(chuàng)建一個(gè)模態(tài)框
function display(value){
$('span').html(value);
}
//ajax
function send(dizhi){
$.ajax({
type: "get",
url: dizhi,
success: function(msg){
var arr=JSON.parse(msg);
console.log(arr);
//alert(arr.value);
var tishi="已經(jīng)處理 "+arr.now +"個(gè),共"+arr.all+"個(gè)";
display(tishi);
if(arr.now!=arr.all){
send("a.php?now="+arr.now+"all="+arr.all);
}else{
alert("完成!");
}
}
});
}
/script
/body
/html
a.php:
?php
require('./dbconfig.php');
$link=mysql_connect(HOST,USER,PASS) or die('數(shù)據(jù)庫鏈接失敗');
mysql_select_db(DBNAME);
/*
查詢數(shù)據(jù)
$sql="select * from user";
$result=mysql_query($sql);
$row=mysql_fetch_assoc($result);
var_dump($row);
*/
/*
循環(huán)插入
for($i=3;$i=100;$i++){
$sql= "insert into user(name,score,state) values('z".$i."',".$i.",1)";
mysql_query($sql);
}
*/
/*查詢需要處理的數(shù)據(jù)總數(shù)*/
//isset($_GET['state'])?$_GET['state']:0;
if(isset($_GET['state'])){
$sql="select count(*) from user";
$result=mysql_query($sql);
$all=mysql_result($result,0);
$now=0;
header("Location: b.php?all={$all}now=0");
}else{
header("Location: b.php?all={$_GET['all']}now={$_GET['now']}");
}
/*返回當(dāng)前處理的數(shù)據(jù)*/
b.php:
?php
require('./dbconfig.php');
$link=mysql_connect(HOST,USER,PASS) or die('數(shù)據(jù)庫鏈接失敗');
mysql_select_db(DBNAME);
/*返回當(dāng)前處理的數(shù)據(jù)*/
//$id=$_GET['id'];//獲取將要處理的id
$now=$_GET['now'];//已經(jīng)處理的個(gè)數(shù)
$all=$_GET['all'];//總共要處理的個(gè)數(shù)
$sql="select score from user limit {$now},1";
$result=mysql_query($sql);
$value=mysql_result($result, 0);
$now++;
$arr=array(
'now'=$now,
'all'=$all,
'value'=$value
);
//print_r($arr);
echo json_encode($arr);
dbconfig.php:
?php
define('HOST','127.0.0.1');
define('USER', 'root');
define('PASS','root');
define('DBNAME','handle');
1、如果服務(wù)器允許mysqldump 并且沒有禁止PHP的shell_exec()這個(gè)函數(shù)的話
直接在PHP里面執(zhí)行mysqldump就可以了。
2、通過mysql_query('show tables')的返回值遍歷每個(gè)表,循環(huán)對每個(gè)表使用查詢語句
select * into outfile '路徑/文件名' from 表名
缺點(diǎn)是這樣得到的是純數(shù)據(jù),恢復(fù)數(shù)據(jù)的時(shí)候你需要額外再寫腳本
3、同樣通過show tables返回表名,遍歷每個(gè)表,通過select 語句查詢,然后逐條結(jié)果處理,比如手工添加drop table 和create table 以及insert into等等,然后再寫入文件。這樣得到的備份數(shù)據(jù)是比較接近mysqldump的結(jié)果的,各種工具都可以用來恢復(fù)數(shù)據(jù)。缺點(diǎn)是如果數(shù)據(jù)庫太大的話,效率不好說
舉例如下:
創(chuàng)建userinfo_update.php頁面用于查詢用戶信息,先顯示信息,在修改:
先通過GET獲取用戶編號查詢用戶信息:
$sql = "select * from user_info where user_id='".$_GET['userId']."'";
$result = mysql_query($sql,$con);
if($row = mysql_fetch_array($result)){
}
頁面效果:
創(chuàng)建update.php文件,用于修改用戶信息:
使用到了mysql_affected_rows() 函數(shù)返回前一次 MySQL 操作所影響的記錄行數(shù)。
//通過post獲取頁面提交數(shù)據(jù)信息
$userId = $_POST[userId];
$userName = $_POST[userName];
$userAge = $_POST[userAge];
$sql = "update user_info set user_name='".$userName."',user_age=".$userAge." where user_id='".$userId."'";
mysql_query($sql,$conn);//執(zhí)行SQL
$mark? = mysql_affected_rows();//返回影響行數(shù)
$url = "userinf_select.php";
運(yùn)行結(jié)果
創(chuàng)建delete.php文件,完成刪除用戶信息功能:
$userId = $_GET['userId'];
include 'connection.php';
$sql = "delete from user_info where user_id='".$userId."'";
mysql_query($sql,$con);
$mark? = mysql_affected_rows();//返回影響行數(shù)
if($mark0){
echo "刪除成功";
}else{
echo? "刪除失敗";
}
mysql_close($con);
運(yùn)行結(jié)果: