在电商网站搭建过程中,前端经常会向后端请求数据,有时候通过HTML、JS和PHP文件的处理来实现数据的连通。通常情况下,用户在HTML中做关键字操作,JS对提交的表单进行数据处理,向后端发起ajax请求对应PHP的api接口,PHP在接收到数据后对连接服务器,服务器再通过PHP中的SQL语句对数据库关键字进行处理返回给PHP,再由PHP返回给前端,前端通过JS处理将数据渲染在HTML中,最终呈现给用户。图1为数据传输流程图:

图1 HTML、JS与PHP之间的数据传输流程图

以加入商品到购物车为例,本例为模拟数据,和实际的数据库的数据不同。

图2 商品列表

加入购物车的点击事件大致步骤为:用户点击"加入购物车"按钮==>页面获取当前商品唯一值(如商品ID:productID)==>JS处理点击事件,将唯一值连同用户信息通过ajax请求传送给PHP===>PHP向服务器请求连接===>数据库语句执行===>服务器将执行结果返回给PHP===>PHP将执行结果传送给前端。

如果数据库语句执行成功,那么数据库中该用户的购物车表就多了一项刚加入的商品数据,同时服务器也会向PHP返回执行成功信息(及一条不为空的数据串),而用户的界面就会显示"成功加入购物车"等字样(如图1-1所示);若执行失败,也会将失败信息(err)传给PHP,用户界面也会显示相应的提示,如图3所示。

图3 成功加入购物车提示

1. HTML中的代码实例,商品列表信息通过引入art-template模块进行渲染,代码如下

<ul class="productContainer">

{{each product prod}}

<li>

<input type="text" value="{{prod.id}}">

<img src="{{prod.img}}"/>

<p>{{prod.title}}</p>

<span>¥{{prod.price}}</span>

<a href="javascript:void(0)">加入购物车</a>

</li>

{{/each}}

</ul>

2. JS中的数据请求处理实例如下,加入购物车的请求的api文件路径为http://localhost/api/add.php,此时将点击加入的商品ID及操作的用户ID封装为对象,用ajax的post请求传给服务端

$(".productContainer").on("click", ".add", function () {

var productID=$("#prodID").val();//获取到当前商品的ID值

$.post("http://localhost/api/add.php", {productID:productID,userID},

function (data) {

if (data.res_code === 1) { //返回的数据中,data.res_code为1表示加入成功

alert("加入成功");//对用户进行加入成功提示

} else {

alert(data.res_message);//若不为1则表示加入失败,data.res_message为失败信息

}

}, "json");

});

3. PHP中的代码(及JS中所请求的add.php文件)

<?php

// CORS跨域

header("Access-Control-Allow-Origin:*");

/* 向购物车添加商品 */

$productID = $_POST["productID"];

$userid = $_POST["userID"];

// 连接数据库服务器

mysql_connect("localhost:3306", "root", "");

// 选择连接数据库的名称

mysql_select_db("cart");

// 读写库编码

mysql_query("set character set utf8");

mysql_query("set names utf8");

// 编写SQL语句

//若该用户未添加该商品,则向cartList表插入该商品,并将数量置为1

$sql1 = "INSERT INTO cartList(productID, userID,count) VALUES ('$productID', '$userID',1)";

//若该用户已添加该商品,再次添加时只在cartList表中让该商品的数量+1

$sql2 = "UPDATE cartList SET count=count+1 WHERE productID= '$productID' AND userid='$userID'";

// 执行SQL语句,首先执行sql1的语句,如果表中有相同的数据,则sql1会执行失败,那么执行sql2

$result = mysql_query($sql1);

if(!$result){

$result = mysql_query($sql2);

}

// 判断

if ($result) { // 执行成功,将res_code的值设为1,并将返回信息设置为"加入成功"

$arr = array("res_code"=>1, "res_message"=>"加入成功");

echo json_encode($arr);

} else { // 执行失败,则将res_code设为0,并将错误信息设置为"加入失败"

$arr = array("res_code"=>0, "res_message"=>"加入失败" . mysql_error());

echo json_encode($arr);

}

// 关闭连接

mysql_close();

?>

4. 当用户进入购物车时,页面要请求该用户在数据库中的购物车表cartList,此时查询结果应该为一个数组,数组里的每一个子元素对应一个唯一的商品对象,数据库查询语句如下:

// 编写SQL语句

//在购物车cartList表中找到该用户已经添加的购物车商品数据的信息

$sql = "SELECT * FROM cartList WHERE userID='$userID'";

// 执行SQL语句

$result = mysql_query($sql);

// 新建一个数组用来存查询出来的结果,每条结果仅有一条商品的信息

$results = array();

// 每次查询成功,将当前查询到的商品结果存入results数组中

while($row = mysql_fetch_row($result))

{

$results[] = $row;

}

if ($results) {//返回数组$results,res_code值设为1

$arr = array("res_code"=>1, "res_message"=>$results);

echo json_encode($arr);

}

else { // 查找失败,返回信息"查找失败",res_code值设为0

$arr = array("res_code"=>0, "res_message"=>"查找失败" . mysql_error());

echo json_encode($arr);

}

关于PHP语法的说明:

mysql_query() 函数执行某个针对数据库的查询,每次查询结果仅有一条数据。

mysql_fetch_row() 从和结果标识 data 关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。依次调用 mysql_fetch_row() 将返回结果集中的下一行,如果没有更多行则返回 FALSE。

转载于:https://blog.51cto.com/14071672/2351459

解析HTML、JS与PHP之间的数据传输的更多相关文章

  1. 【Vue课堂】Vue.js 父子组件之间通信的十种方式

    这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...

  2. 深入解析Backbone.js框架的依赖库Underscore.js的作用

    这篇文章主要介绍了深入解析Backbone.js框架的依赖库Underscore.js的作用,用过Node.js的朋友对Underscore一定不会陌生:)需要的朋友可以参考下 backbone必须依 ...

  3. vue.js 同级组件之间的值传递方法(uni-app通用)

    vue.js 兄弟组件之间的值传递方法 https://blog.csdn.net/jingtian678/article/details/81634149

  4. Node.js 和 Python之间如何进行选择?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/nodejs-vs-python-which ...

  5. 标签页tab.js 在栏目之间切换,局部变化

    1.在使用bootstrap 中,我们会用到在栏目之间切换,来刷新页面的局部,可以使用下面的方法 <link rel="stylesheet" href="http ...

  6. Pako.js压缩解压,vue压缩解压,前后端之间高效数据传输

    项目开发中常常会遇到前后端之间有大量数据传输占用带宽导致页面响应慢的问题,这时候我们可以考虑使用Pako.js对信息进行压缩之后传输. 我在前端使用的是vue-element-admin前端框架.框架 ...

  7. JS多异步之间的协作方案

    场景:使用工具函数downloadAllAsync接收一个URL数组并下载所有文件,结果返回一个存储了文件内容的数组,每个URL对应一个字符串. 好处:downloadAllAsync并不只有清理嵌套 ...

  8. 解析JSON对象与字符串之间的相互转换

    在开发的过程中,如果对于少量参数的前后台传递,可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,这样后台 接受的时候Request多个很麻烦 ...

  9. Vue.js 父子组件之间通信的方式

    Vue 父子组件之间的同学有一下几种方式: 1. props 2. $emit -- 组件封装用的比较多 3. .sync -- 语法糖 4. $attrs 和 $listeners -- 组件封装用 ...

随机推荐

  1. 【Redis】集群NetCore实战

    环境准备 1. Redis集群(Windows集群搭建) 启动Redis集群,给每个节点加上Title start .conf start .conf start .conf start .conf ...

  2. JDK常用命令行工具使用

  3. php--一些新知识总结

    魔术方法__invoke() 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用 class Test { public function __invoke($a) { va ...

  4. 让图片适合在静态文本控件窗口大小 MFC

    1.加入 IDC_STATIC1 静态文本控件. 2.为文本控件添加 STATIC 型变量 3.在OnInitDialog函数中添加以下代码 //设置该静态控件为显示位图的 m_bitmap.Modi ...

  5. AJ学IOS 之CoreLocation反地理编码小Demo输入经纬度得到城市

    AJ分享,必须精品 一:效果 输入经纬度,可以得到相应的地名 二:思路 跟地里编码差不多 1.获取用户输入的经纬度 2.根据用户输入的经纬度创建CLLocation对象 3.根据CLLocation对 ...

  6. 2019-07-31【机器学习】无监督学习之聚类 K-Means算法实例 (图像分割)

    样本: 代码: import numpy as np import PIL.Image as image from sklearn.cluster import KMeans def loadData ...

  7. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(八)之Reusing Classes

    The trick is to use the classes without soiling the existing code. 1. composition--simply create obj ...

  8. Persona & User Scenario

    Persona: Tom:男,21岁,大学生,周末经常和同学们一起出去吃饭.唱歌.打球.郊游,期间会时不时拍一些照片以作纪念,长期积累的照片数量较多且内容繁杂,很少对照片进行整理: Alisa:女,2 ...

  9. The Super Powers UVA - 11752

    题目大意:将范围从1~pow(2,64)-1内的super power输出.super power的定义:一个数x至少存在两种x=pow(i,k),(k!=1). 题解: 注意数据范围2的64次方-1 ...

  10. Docker常用命令--ps/attach/run

    ps查看container 若查看正在运行的container docker ps 查看所有的container docker ps -a run启动容器 第一次启动container docker ...