2019-06-16 22:24:23 qq_41716624 阅读数 613

layui前端提交的json数据,php后端循环读取数据内容

layui的数据表格在前端发送多选数据的时候,发送的是json数据,对于一些对Json数据不太了解的小伙伴们来说,解析可能会遇到点难度,接下来给你们提供一个简单实用的方法
一般layui的数据表格多选发送的json数据为

[{"id":"10001","username":"杜甫","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"点击此处,显示更多。当内容超出时,点击单元格会自动显示更多内容。","experience":"116","ip":"192.168.0.8","logins":"108","joinTime":"2016-10-14"},{"id":"10002","username":"李白","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子,丹丘生,将进酒,杯莫停。 与君歌一曲,请君为我倾耳听。(倾耳听 一作:侧耳听) 钟鼓馔玉不足贵,但愿长醉不复醒。(不足贵 一作:何足贵;不复醒 一作:不愿醒/不用醒) 古来圣贤皆寂寞,惟有饮者留其名。(古来 一作:自古;惟 通:唯) 陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱,径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。","experience":"12","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"},{"id":"10003","username":"王勃","email":"xianxin@layui.com","sex":"男","city":"浙江杭州","sign":"人生恰似一场修行","experience":"65","ip":"192.168.0.8","logins":"106","joinTime":"2016-10-14"}]

上面的json数据可以在http://www.bejson.com/里面进行格式化查看
我们一般来说主要获取id来进行多条数据的增删改查
然后下面贴代码

/**
 * @name layui数据表格多选提交的json数据多选删除
 * @param mixed $str 获取前端过来的数据
 * @param mixed $json 数据数组
 */
$str = $_POST['str'];
$provinces = json_decode($str, true);
foreach ($provinces as $province) {
    foreach ($province as $json) {
        $id = $json['id'];
        echo $id;
    }
}

如果要获取其他数据,只需要在最里面,添加

echo $json['username'];

这串代码很简单的,对于一些初入php的新手来说简单易懂

转载请注明地址

2018-12-29 15:29:03 qq_42249896 阅读数 196

在这里插入图片描述

<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
use think\Db;
use think\db\Query;
class Index extends Controller
{
    public function index()
    {
        return $this->fetch('index');
    }

    public function ceshi()
    {
        $data=Db::name('user')
            ->select();
        echo json_encode($data);
    }
}
<!Doctype html>
<head>
<title>撸起袖子加油干</title>
<meta charset='utf-8'>
<script src="http://www.jq22.com/jquery/angular-1.4.6.js"></script>
<script src="__STATIC__/js/jquery-3.3.1.min.js"></script>
<script src="__STATIC__/js/layer/layer.js"></script>
</head>
<body ng-app="myApp" ng-controller="Ctrl">
<table border="1" width="600" height="400">
    <tr>
        <td>姓名</td>
        <td>密码</td>
        <td>头像</td>
        <td><input type="checkbox" ng-model="box" ng-click="selectAll()">
        </td>
    </tr>
    <tr ng-repeat="n in news">
        <td>{{n.nickname}}</td>
        <td>{{n.password}}}</td>
        <td>{{n.phone}}</td>
        <td><input type="checkbox" ng-model="n.ck" /></td>
    </tr>
</table>
</body>
<script type="text/javascript">
    var app = angular.module('myApp', []);
    app.controller('Ctrl', function($scope, $http) {
        $http({
            method: 'POST',
            url: "{:url('Index/ceshi')}",
            dataType: 'JSON'
        }).then(function successCallback(response) {
            $scope.news=response.data;
        }, function errorCallback(response) {
            // 请求失败执行代码
        });
    });
</script>
</html>
2018-05-24 10:43:28 LJFPHP 阅读数 3507

一、背景

众所周知的,在循环语句中执行数据库操作,对数据库来说负担很大。
举个例子:

for(int I=0;I<500;I++){查询语句}

      这样你的这个查询语句会执行500次,稍极端一点,忽略数据库内部执行语句的时间,服务器到数据库服务器之间网络不畅,光是服务器发送查询请求到数据库就需要1秒的时间,返回又1秒。这样你光是网络原因的等待时间就1000秒了。而如果你是在for语句外一次性取500条数据,这个网络请求等待时间就2秒。

      当循环量特别大的时候,一方面会造成严重的网络延迟,一方面可能会连接数据库失败,因此,避免循环中执行sql也算是业界的一个准则。

二、如何避免

大前提:博主一直用的laravel框架,因此会用到一些laravel特有的方法,殊途同归,各位道友心里明白就好。

1、循环内拼接sql语句,循环外执行

例如:

//假设这里的$users是一个很大的数组,我们要循环取出其中的值
foreach($users as $user){
//这部分的sql是我从项目中随便摘抄出来的。主要就是实现拼接sql语句
$sql .= " ('{$order_sn}', '{$this->user_id}', '{$deliver_fee}', 0, "
                        . " '', '', '', "
                        . " '{$add_time}','{$order_status}', '{$order_amount}', '{$remark}', "
                        . " '{$pickup_code}', '{$self_pickup}', '{$collect_order_sn}', '{$key}', {$reservation_time}),";
}
//循环中拼接好sql之后,我们在循环外执行
$sql = substr($sql, 0, -1);
DB::statement($sql);

2、where条件换为where in()

比如我们的where()条件中要使用大规模的数组,那么在语句应该是:

foreach($arr as $v){
DB::table('')->where('id',$v->id);
}

此时我们可以转变一下:

//先取出条件数组$arr,在直接执行whereIn即可
DB::table('')->whereIn('id',$arr);

注意:如果数据量很大,比如几十万条数据,那么whereIn也会成为代码的瓶颈,这个函数适用于数据量不是很大的情况。

3、laravel的chunk方法

官方文档:https://laravel-china.org/docs/laravel/5.5/eloquent/1332

      如果你需要处理数千个 Eloquent 记录,可以使用 chunk 命令。chunk 方法会检索 Eloquent 模型的「分块」,将它们提供给指定的 Closure 进行处理。在处理大型结果集时,使用 chunk 方法可节省内存:

Flight::chunk(200, function ($flights) {
    foreach ($flights as $flight) {
        //
    }
});

      传递到方法的第一个参数是希望每个「分块」接收的数据量。闭包则被作为第二个参数传递,它会在每次执行数据库查询传递每个块时被调用。

      上面这段代码的意思是,先执行200条,执行完之后,再继续执行后200条。用一种类似于分页的方法来小规模的调用数据库操作,如此便可避免大数据量的操作。

4、laravel的chunk()方法的漏洞

注意:laravel的chunk方法在筛选条件并且更新数据的时候,会出现漏掉数据的bug,具体的可参考博客:https://www.jianshu.com/p/5dafd0d6e69a
例如:

User::where('approved', 0)->chunk(100, function ($users) {
  foreach ($users as $user) {
    $user->update(['approved' => 1]);
  }
});

      如果要运行上面的代码,并不会有报错,但是where条件是筛选approved为0的user然后将approved的值跟新为1。

      在这个过程中,档第一数据库的数据被修改后,下一个数据块的数据将是在被修改后的数据中选出来的,这个时候数据变了,而page也加了1。所以执行结束后,只对数据中一半的数据进行了更新操作。

      如果没有明白的话,我们来看一下chunk的底层实现。还以上面的代码为例,假如一共有400条数据,数据被按照100条进行分块处理。

page = 1: 最开始的时候page为1,选取1-100条数据进行处理;

      page = 2: 这时候前一百数据的approved值全部为1,那么在次筛选的时候,此时数据库中符合条件的数据只有300条,而且数据将从第101条开始,而这个时候的page=2,那么处理的数据将是第200-300之前的数据。之后依旧。

public function chunk($count, callable $callback)
{
    $results = $this->forPage($page = 1, $count)->get();

    while (count($results) > 0) {
        // On each chunk result set, we will pass them to the callback and then let the
        // developer take care of everything within the callback, which allows us to
        // keep the memory low for spinning through large result sets for working.
        if (call_user_func($callback, $results) === false) {
            return false;
        }
        $page++;
        $results = $this->forPage($page, $count)->get();
    }
    return true;
}

当然,关于chunk()的这个漏洞,我没找到chunk()的源码,但是我用laravel5.5没有出现这个问题。如果有大神看到这篇博客,请不吝赐教。

end

2015-12-26 13:40:19 qq_17615475 阅读数 667

(《Head First PHP & MySQL》学习记录)


输入姓名及邮箱提交可订阅,订阅后可输入邮箱取消订阅,可给所有订阅用户发送邮件。

订阅界面:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Add Email</title>
</head>

<body>
	<h1>Add to our email list</h1>
    <p>Enter your name and email and get our updatest information!</p>
    <form method="post" action="email-list.php">
    	<label for="firstname">First Name: </label>
        <input type="text" id="firstname" name="firstname" /><br />
        <label for="lastname">Last Name:</label>
        <input type="text" id="lastname" name="lastname" /><br />
        <label for="email">Email: </label>
        <input type="text" id="email" name="email" /><br />
        <input type="submit" value="Add" />
    </form>
</body>
</html>


<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Add email</title>
</head>

<body>
	<h1>Add to our email list</h1>
    <?php
		$firstname=$_POST['firstname'];
		$lastname=$_POST['lastname'];
		$email=$_POST['email'];
		
    	$dbc=mysqli_connect('127.0.0.1','root','12345678','maystudio') or die('Error connecting to MySQL server.');
		
		$query="INSERT INTO email_list (first_name,last_name,email) VALUES ('$firstname','$lastname','$email')";
		
		mysqli_query($dbc,$query) or die('Error query database.');
		
		mysqli_close($dbc);
		
		echo '<p>Thank you for subscription, we are not going to let you down!</p>';
		echo '<a href="unsubscribe.html">Unsubscription</a>';
	?>
</body>
</html>

取消订阅界面:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Unsubscribe Us</title>
</head>

<body>
	<h1>Unsubscription</h1>
    <p>We are so sorry to let you down.=(</p>
    <form method="post" action="unsubscribe.php">
    	<label for="email">Enter your email address: </label>
        <input type="text" id="email" name="email" /><br />
        <input type="submit" value="Unsubscribe" />
    </form>
</body>
</html>

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Unsubscribe Us</title>
</head>

<body>
	<h1>Unsubscription</h1>
	<?php
		$email=$_POST['email'];
		
		$dbc=mysqli_connect('127.0.0.1','root','12345678','maystudio') or die('Error connecting to MySQL server.');
		$query="DELETE FROM email_list WHERE email = '$email' ";
		mysqli_query($dbc,$query) or die('Error querying database.');
		mysqli_close($dbc);
		
		echo 'Successful unsubscription!';
	?>
</body>
</html>

发送邮件界面:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>

<body>
	<h1>Send email to subscribers</h1>
    <p>Maystudio's administrators only!</p>
    <form method="post" action="send-email.php">
    	<label for="subject">Subject: </label><br />
        <input type="text" id="subject" name="subject" /><br />
        <label for="body">Body: </label><br />
        <textarea id="body" name="body" rows="8" cols="60"></textarea><br />
        <input type="submit" name="submit" value="Send" />
    </form>
</body>
</html>

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Send email</title>
</head>

<body>
	<h1>Email sent</h1>
	<?php
		$from='changingvan@163.com';
		$subject=$_POST['subject'];
		$body=$_POST['body'];
		
		$dbc=mysqli_connect('127.0.0.1','root','12345678','maystudio') or die('Error connecting to MySQL server.');
		$query="SELECT * FROM email_list";
		$result=mysqli_query($dbc,$query) or die('Error querying database.');
		while($row=mysqli_fetch_array($result)){
			$first_name=$row['first_name'];
			$last_name=$row['last_name'];
			$msg="Dear $first_name $last_name,\n $body";
			$to=$row['email'];
			mail($to,$subject,$msg,'From: '.$from);
			echo 'Email sent to '.$to.'<br />';
		}
		mysqli_close($dbc);
	?>
</body>
</html>


代码下载:http://download.csdn.net/detail/qq_17615475/9377903

2016-11-10 00:33:39 Mad_Geek 阅读数 3061


流程:

循环查询redis队列里面的数据

然后post提交数据

反馈信息再写入另一个 redis list里面

cmd  => php task.php


<?php

/**
 * System Name: Maddong 1.0
 * User: RATDATA
 * Date: 2016/11/8 4:40
 * © 2016 MadCTO
 */
class Net
{
    function callInterfaceCommon($data_in = null)
    {
        $data_in=unserialize($data_in);
        if(empty($data_in['id'])||empty($data_in['phone'])||empty($data_in['content']))
        {
            return array('state'=>false,'message'=>json_encode($data_in));exit;
        }
        $URL = "http://xxxxx/sms.aspx";//运营商URL
        $data =
            [
                'account' => 'xx',
                'password' => 'xxx',
                'userid' => 'xxx',
                'mobile' => $data_in['phone'],
                'content' =>  $data_in['content'],
                'sendTime' => null,
                'action' => 'send',
                'extno' => null,
            ];//要发送的数据 自己修改
        $ch = curl_init();
        //判断ssl连接方式
        if (stripos($URL, 'https://') !== false) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_SSLVERSION, 1);
        }
        $connttime = 500; //连接等待时间500毫秒
        $timeout = 15000;//超时时间15秒

        $querystring = "";
        if (is_array($data)) {
            // Change data in to postable data
            foreach ($data as $key => $val) {
                if (is_array($val)) {
                    foreach ($val as $val2) {
                        $querystring .= urlencode($key) . '=' . urlencode($val2) . '&';
                    }
                } else {
                    $querystring .= urlencode($key) . '=' . urlencode($val) . '&';
                }
            }
            $querystring = substr($querystring, 0, -1); // Eliminate unnecessary &
        } else {
            $querystring = $data;
        }
        curl_setopt($ch, CURLOPT_URL, $URL);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//反馈信息
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); //http 1.1版本
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $connttime);//连接等待时间
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeout);//超时时间
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $querystring);
        $file_contents = curl_exec($ch);//获得返回值
        $status = curl_getinfo($ch);
        curl_close($ch);

        $call_back_json = json_encode(simplexml_load_string($file_contents, 'SimpleXMLElement', LIBXML_NOCDATA));
        $reslut = json_decode($call_back_json, true);
        $ststus = $reslut['returnstatus'];

        if ($ststus == 'Success') {
            return array('state'=>true);
        } else {
            return array('state'=>false,'message'=>json_encode($reslut));
        }

    }
}

set_time_limit(0);
header("Content-type: text/html; charset=utf-8");
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379) or die('errot');
$sms = new Net();
while (true) {
    $data = $redis->LPOP('Queue');
    if (!empty($data)) {

        $res = $sms->callInterfaceCommon($data);
        if($res['state'])
        {
            $data= unserialize($data);
            $redis->LPUSH('Queue2', serialize(array('id'=>$data['id'],'status'=>'success','time'=>time())));

        }else
        {
            $data= unserialize($data);
            $redis->LPUSH('Queue2', serialize(array('id'=>$data['id'],'status'=>'fail','time'=>time(),'msg'=>$res['message'])));
        }
    }
    sleep(rand() % 3);
}


没有更多推荐了,返回首页