MySql Socket 完成數據庫的增查Demo

? ? ? ? ?需求: 利用MySql數據庫結合前端技術完成用戶的注冊(要求不使用Web服務技術),所以 Demo采用Socket技術實現Web通信.

第一部分:數據庫創建

數據庫采用mysql 5.7.18, 數據庫名稱為MyUser, 內部有一張表 user.字段有 Id,UserName,Psd,Tel

?

第二部分:數據庫連接與Socket通信

創建控制臺程序(服務端程序),添加以下類

1 MySqlHelper

?建立MySqlHelper 類,用于實現數據庫操作

public class MysqlHelper{//數據庫連接字符串 public static string Conn = "Database='Myuser';Data Source='localhost';User Id='root';Password='';charset='utf8'"; //XXX的為修改項public static   void SetConn(string UserName = "root", string Password="", string IP= "localhost",   string Database="Myuser"){Conn = "datasource="   IP   ";username="   UserName   ";password="   Password   ";database="   Database   ";charset=utf8";}/// <summary> /// 給定連接的數據庫用假設參數執行一個sql命令(不返回數據集) /// </summary> /// <param name="connectionString">一個有效的連接字符串</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns>執行命令所影響的行數</returns> public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){MySqlCommand cmd = new MySqlCommand();using (MySqlConnection conn = new MySqlConnection(connectionString)){PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);int val = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return val;}}/// <summary> /// 用現有的數據庫連接執行一個sql命令(不返回數據集) /// </summary> /// <param name="connection">一個現有的數據庫連接</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns>執行命令所影響的行數</returns> public static int ExecuteNonQuery(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){MySqlCommand cmd = new MySqlCommand();PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);int val = cmd.ExecuteNonQuery();//cmd.Parameters.Clear();return val;}/// <summary> ///使用現有的SQL事務執行一個sql命令(不返回數據集) /// </summary> /// <remarks> ///舉例: /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> /// <param name="trans">一個現有的事務</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns>執行命令所影響的行數</returns> public static int ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){MySqlCommand cmd = new MySqlCommand();PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);int val = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return val;}/// <summary> /// 用執行的數據庫連接執行一個返回數據集的sql命令 /// </summary> /// <remarks> /// 舉例: /// MySqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> /// <param name="connectionString">一個有效的連接字符串</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns>包含結果的讀取器</returns> public static MySqlDataReader ExecuteReader(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){//創建一個MySqlCommand對象 MySqlCommand cmd = new MySqlCommand();//創建一個MySqlConnection對象 MySqlConnection conn = new MySqlConnection(connectionString);//在這里我們用一個try/catch結構執行sql文本命令/存儲過程,因為如果這個方法產生一個異常我們要關閉連接,因為沒有讀取器存在, //因此commandBehaviour.CloseConnection 就不會執行 try{//調用 PrepareCommand 方法,對 MySqlCommand 對象設置參數 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);//調用 MySqlCommand 的 ExecuteReader 方法 MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);//清除參數 cmd.Parameters.Clear();return reader;}catch{//關閉連接,拋出異常 conn.Close();throw;}}/// <summary> /// 返回DataSet /// </summary> /// <param name="connectionString">一個有效的連接字符串</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns></returns> public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){//創建一個MySqlCommand對象 MySqlCommand cmd = new MySqlCommand();//創建一個MySqlConnection對象 MySqlConnection conn = new MySqlConnection(connectionString);//在這里我們用一個try/catch結構執行sql文本命令/存儲過程,因為如果這個方法產生一個異常我們要關閉連接,因為沒有讀取器存在,try{//調用 PrepareCommand 方法,對 MySqlCommand 對象設置參數 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);//調用 MySqlCommand 的 ExecuteReader 方法 MySqlDataAdapter adapter = new MySqlDataAdapter();adapter.SelectCommand = cmd;DataSet ds = new DataSet();adapter.Fill(ds);//清除參數 cmd.Parameters.Clear();conn.Close();return ds;}catch (Exception e){throw e;}}public static DataTable GetDataTable(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){//創建一個MySqlCommand對象 MySqlCommand cmd = new MySqlCommand();//創建一個MySqlConnection對象 MySqlConnection conn = new MySqlConnection(connectionString);//在這里我們用一個try/catch結構執行sql文本命令/存儲過程,因為如果這個方法產生一個異常我們要關閉連接,因為沒有讀取器存在,try{//調用 PrepareCommand 方法,對 MySqlCommand 對象設置參數 PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);//調用 MySqlCommand 的 ExecuteReader 方法 MySqlDataAdapter adapter = new MySqlDataAdapter();adapter.SelectCommand = cmd;DataTable ds = new DataTable();adapter.Fill(ds);//清除參數 cmd.Parameters.Clear();conn.Close();return ds;}catch (Exception e){throw e;}}/// <summary> /// 用指定的數據庫連接字符串執行一個命令并返回一個數據集的第一列 /// </summary> /// <remarks> ///例如: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> ///<param name="connectionString">一個有效的連接字符串</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns>用 Convert.To{Type}把類型轉換為想要的 </returns> public static object ExecuteScalar(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){MySqlCommand cmd = new MySqlCommand();using (MySqlConnection connection = new MySqlConnection(connectionString)){PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);object val = cmd.ExecuteScalar();cmd.Parameters.Clear();return val;}}/// <summary> /// 用指定的數據庫連接執行一個命令并返回一個數據集的第一列 /// </summary> /// <remarks> /// 例如: /// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); /// </remarks> /// <param name="connection">一個存在的數據庫連接</param> /// <param name="cmdType">命令類型(存儲過程, 文本, 等等)</param> /// <param name="cmdText">存儲過程名稱或者sql命令語句</param> /// <param name="commandParameters">執行命令所用參數的集合</param> /// <returns>用 Convert.To{Type}把類型轉換為想要的 </returns> public static object ExecuteScalar(MySqlConnection connection, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters){MySqlCommand cmd = new MySqlCommand();PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);object val = cmd.ExecuteScalar();cmd.Parameters.Clear();return val;}/// <summary> /// 準備執行一個命令 /// </summary> /// <param name="cmd">sql命令</param> /// <param name="conn">OleDb連接</param> /// <param name="trans">OleDb事務</param> /// <param name="cmdType">命令類型例如 存儲過程或者文本</param> /// <param name="cmdText">命令文本,例如:Select * from Products</param> /// <param name="cmdParms">執行命令的參數</param> private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms){if (conn.State != ConnectionState.Open)conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null)cmd.Transaction = trans;cmd.CommandType = cmdType;if (cmdParms != null){foreach (MySqlParameter parm in cmdParms)cmd.Parameters.Add(parm);}}}

  

2,User類與UserHelper類

建立用戶類User與用戶操作類UserHelper

User

public class User{public int Id { get; set; }public string UserName { get; set; }public string Psd { get; set; }public string PhoneNum { get; set; }}

  

UserHelper

public   class UserHelper{/// <summary>/// 獲取用戶列表/// </summary>/// <param name="cmdText"></param>/// <returns></returns>public static  List<User> GetUsers(){var cmdText = "select * from Users";var data = MysqlHelper.GetDataSet(MysqlHelper.Conn, System.Data.CommandType.Text, cmdText, new MySql.Data.MySqlClient.MySqlParameter());List<User> userList = new List<User>();foreach (DataRow row in data.Tables[0].Rows){User user = new User();user.Id = int.Parse(row[0].ToString());user.UserName=(row[1].ToString());user.Psd=(row[2].ToString());user.PhoneNum=(row[3].ToString());userList.Add(user);}return userList;}/// <summary>/// 根據姓名查找用戶/// </summary>/// <param name="name"></param>/// <returns></returns>public static  User GetUserByName(string name){var cmdText = "select * from Users Where UserName=?name";var pars = new MySql.Data.MySqlClient.MySqlParameter("?name", name);var data = MysqlHelper.GetDataSet(MysqlHelper.Conn, System.Data.CommandType.Text, cmdText, pars);User user = new User();if (data.Tables.Count == 0){return null;}if (data.Tables[0].Rows.Count != 1){return null;}foreach (DataRow row in data.Tables[0].Rows){               user.Id = int.Parse(row[0].ToString());user.UserName = (row[1].ToString());user.Psd = (row[2].ToString());user.PhoneNum = (row[3].ToString());;}return user;}/// <summary>/// 添加用戶/// </summary>/// <param name="user"></param>/// <returns></returns>public static bool AddUser(User user){var sqlInsert = "insert into Users(UserName,Psd,Tel) values"  "('"   user.UserName   "','"   user.Psd   "','"   user.PhoneNum   "')";           var parms = new MySqlParameter();var data = MysqlHelper.ExecuteNonQuery(MysqlHelper.Conn, System.Data.CommandType.Text, sqlInsert, parms);return data>0;}}

  

3 Socket

網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,這個連接的一端稱為一個socket.socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口;

利用Socket技術,可以捕捉Http請求,獲取數據.構建SocketHelper類,獲取前端頁面請求.默認Socket 端口為8086

public class SocketHelper{static Socket m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/// <summary>/// Socket初始化 /// </summary>public static bool  Init(){try{m_socket.Bind(new IPEndPoint(IPAddress.Any, 8086));m_socket.Listen(100);m_socket.BeginAccept(new AsyncCallback(OnAccept), m_socket);Console.WriteLine("開啟Socket服務成功!!");Console.Read();return true;}catch (Exception ){Console.WriteLine("開啟Socket服務失敗!!,請檢查網絡,端口8086是否被占用!!!");Console.Read();return false;}}public static void Route(string path, Dictionary<string, string> param, Socket response){if (param.Count == 1){try{var userName = param["userName"];var searUser = UserHelper.GetUserByName(userName);if (searUser != null){HomePage(response, "該用戶名已經被占用!!");Console.WriteLine("** - **");Console.WriteLine("用戶名"   userName   "被占用");Console.WriteLine("");HomePage(response, "no");}else{HomePage(response, "ok");}}catch (Exception e){HomePage(response, e.Message);Console.WriteLine("** - **");Console.WriteLine("發生錯誤,錯誤原因為"   e.Message);Console.WriteLine("");}return;}else if (param.Count == 3) {try{User user = new User();user.UserName = param["userName"];user.Psd = param["psd"];user.PhoneNum = param["phoneNum"];var isSuccess = UserHelper.AddUser(user);if (isSuccess){HomePage(response, "ok");Console.WriteLine("** - **");Console.WriteLine("用戶名為"   user.UserName   "已添加到數據庫!!");Console.WriteLine("");}else{HomePage(response, "no");Console.WriteLine("** - **");Console.WriteLine("用戶名為"   user.UserName   "添加到數據庫失敗!!");Console.WriteLine("");}}catch (Exception e){HomePage(response, e.Message);Console.WriteLine("** - **");Console.WriteLine("發生錯誤,錯誤原因為"   e.Message);Console.WriteLine("");}}else{HomePage(response, "參數錯誤!!");Console.WriteLine("** - **");Console.WriteLine("參數錯誤" );Console.WriteLine("");}return;}public static void OnAccept(IAsyncResult ar){try{Socket socket = ar.AsyncState as Socket;Socket new_client = socket.EndAccept(ar);socket.BeginAccept(new AsyncCallback(OnAccept), socket);byte[] recv_buffer = new byte[1024 * 640];int real_recv = new_client.Receive(recv_buffer);string recv_request = Encoding.UTF8.GetString(recv_buffer, 0, real_recv);Console.WriteLine(recv_request);Resolve(recv_request, new_client);}catch{}}public static void Resolve(string request, Socket response){string[] strs = request.Split(new string[] { "\r\n" }, StringSplitOptions.None);if (strs.Length > 0){string[] items = strs[0].Split(' ');Dictionary<string, string> param = new Dictionary<string, string>();if (strs.Contains("")){string post_data = strs[strs.Length - 1];if (post_data != ""){string[] post_datas = post_data.Split('&');foreach (string s in post_datas){param.Add(s.Split('=')[0], s.Split('=')[1]);}}}Route(items[1], param, response);}}public static void HomePage(Socket response,string result){string statusline = "HTTP/1.1 200 OK\r\n";byte[] statusline_to_bytes = Encoding.UTF8.GetBytes(statusline);string content = result;byte[] content_to_bytes = Encoding.UTF8.GetBytes(content);string header = string.Format("Access-Control-Allow-Origin:*\r\nContent-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", content_to_bytes.Length);byte[] header_to_bytes = Encoding.UTF8.GetBytes(header);response.Send(statusline_to_bytes);response.Send(header_to_bytes);response.Send(new byte[] { (byte)'\r', (byte)'\n' });response.Send(content_to_bytes);response.Close();}}

  

第三部分 前端頁面與Ajax請求

?前端頁面設計為:

ajax請求代碼:

$('.red_button').click(function () {if (user_Boolean && password_Boolean && varconfirm_Boolean && Mobile_Boolean == true) {$.ajax({type: 'POST',url: 'http://127.0.0.1:8086/',data: {'userName':$('#userName').val(),'psd': $('#psd').val(),'phoneNum': $('#phoneNum').val()},success: function (data) {if (data == "ok") {alert("注冊成功!!")} else {alert("data");}}});} else {alert("請完善信息");}
});

?

至此,程序完成.運行程序進行驗證.

1:啟動服務端程序

?

?

2:啟動前端頁面,進行數據填寫

3 添加結果

?

? ? 至此 ,Demo功能完成。之前沒有試過利用Socket技術完成Ajax請求,這次也算是一次嘗試,偶爾看到這個程序,以防以后需要 做個筆記..

?

?

?

?

?

?

?

本文轉載于:猿2048https://www.mk2048.com/blog/blog.php?id=caichj&title=MySql+Socket 完成數據庫的增查Demo

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370976.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370976.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370976.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle導數卡死,oracle-審計導數

1、因審計需求&#xff0c;需要將MySQL、Oracle數據庫中需要的表數據導入到SqlSERVER進行審計。2、之前的方法&#xff1a;A. oracle組將表dump下來&#xff0c;進行壓縮&#xff0c;傳送到oracle導數服務器(中轉服務器)&#xff0c;再進行還原&#xff0c;然后修改表結構&…

蘋果桌面主題_看膩了手機自帶的桌面主題,試試這個

在這個看臉的時代&#xff0c;顏值似乎越來越重要了。尤其是我們每天都要看到的手機桌面&#xff0c;如果它的顏值好一點&#xff0c;也許我們的心情會更好&#xff0c;所以有不少人都用手機自帶的主題來美化桌面&#xff0c;但是對于喜歡個性的我們&#xff0c;手機自帶的主題…

Java SE 11:推動Java向前發展

介紹 在我看來&#xff0c;這篇文章提出了Java語言應該如何發展以保持其作為首選語言的地位。 它還提供了一些我喜歡但有時&#xff08;可能永遠不會&#xff09;成為Java一部分的功能&#xff0c;由于我將要解釋的某些原因&#xff0c;這些功能有時我已經愛上了。 我真的很想…

python之property屬性

Property的概念&#xff1a;property是一種特殊的屬性&#xff0c;訪問它時會執行一段功能&#xff08;函數&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#園的半徑radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用細節及各種問題

解決markdown圖片不顯示(返回403 forbidden)、添加本地圖片無法顯示、修改文章page模板、同時部署發布同步到多個倉庫站點(Github、coding、gitee 碼云) 圖片不顯示 在使用過程中&#xff0c;會發現有的引用圖片無法顯示的問題。但是如果直接復制圖片地址到瀏覽器打開的話顯示…

oracle的等保,Oracle等保測評相關指令

Oracle用戶管理:SQL*Pluscreate user 用戶名 identified by 密碼; //創建用戶grant 權限(dba管理員&#xff0c;resource普通用戶&#xff0c;connect訪客) to 用戶名; //授權drop user 用戶名 cascade; //刪除用戶&#xff0c;加cascade會把用戶創建的所有東西刪除Linux設置用…

Spring3 + JPA2 + Java EE6 App Server =配置混亂

Spring很棒&#xff0c;JavaEE6很棒&#xff0c;最新的JavaEE6 Application服務器也很棒。 這篇文章不是Spring Vs JavaEE6上的專欄文章&#xff0c;而是我在JBoss AS-7.1 App Server上移植Spring3 JPA2&#xff08;Hibernate&#xff09;應用程序的經驗。 我的應用程序要求非…

python面向對象進階(1)

面向對象進階 isinstance(obj,cls) 檢查是否obj是類cls的對象class Foo(object): passobj Foo() isinstance(obj,Foo)issubclass(sub,super) 檢查sub是否是super的派生類class Foo(object): passclass Bar(Foo): passissubclass(Bar,Foo) 反射python面向對象中的反射&#xff…

智能小車37:異常在ARM、JAVA、硬件里的實現

幾乎所有編程語言都有異常&#xff0c;可以說有程序就有異常。今天學習Arm的中斷(異常)處理,聯想到Java的異常,硬件中如何實現等問題&#xff0c;下面給大家分享一下。 一、Arm的中斷。 1.觸發異常 2.保存現場 3.cpu進入異常工作模式&#xff0c;程序指針(pc)跳入異常入口&…

c++builder提高批量動態創建panel的速度_騎行時影響速度的事項有哪些 怎樣有效提高騎行速度 單車租賃信息...

撇開人的因素在自行車的組件中對車速影響最大的幾項是什么?車重?自鎖?輪組?傳動?我的個人感受&#xff0c;從提高幅度上來講&#xff0c;而不是重要性上來講一、自鎖起碼提高你50%的速度&#xff0c;我不用自鎖和別人一起走AVS25就很辛苦了&#xff0c;用了自鎖&#xff0…

ansys matlab 調用,matlab 調用ansys (轉載)

問題的提出&#xff1a;我們經常會需要用ansys計算一些東西&#xff0c;之后再用matlab來處理計算的結果。當修改某些參數重復上述過程的時候&#xff0c;就比較容易出現問題——比如ansys模型中的參數和matlab程序中參數的一致性問題等。這時可以考慮采用下面的協同工作的方法…

本地存儲之sessionStorage

源碼可以到GitHub上下載&#xff01; sessionStorage&#xff1a; 關閉瀏覽器再打開將不保存數據 復制標簽頁會連同sessionStorage數據一同復制 復制鏈接地址打開網頁不會復制seessionStorage內的數據 清除緩存加載當前頁對頁面無影響 1) 同源策略限制。若想在不同頁面之間對同…

哈希三道題

兩數之和 給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意…

zemax光學設計超級學習手冊_穿越十年的一個ZEMAX光學設計案例

目前超過兩千人的光學與光學設計方面的微信公眾號&#xff0c;歡迎您&#xff01;穿越十年的一個ZEMAX光學設計案例作者&#xff1a;窗臺小綠蘿CAD&#xff0c;這個詞已經深入到學習、工作很多年&#xff0c;翻譯過來就是Computer Aided Design&#xff0c;計算機輔助設計。隨著…

Java本質和性能

最初的問題是如何計算二進制數中1的個數&#xff1f; 我包含了使用Integer.bitCount&#xff08;&#xff09;的性能比較&#xff0c;該性能可以轉換為固有特性&#xff0c;即單個機器代碼指令POPCNT和執行相同功能的Java代碼。 題 如何計算二進制數中1的個數&#xff1f; 假…

spring RequestMapping 包含http的部分以及各部分詳解

RequestMapping有四個參數&#xff0c;分別為&#xff1a;1、value&#xff1a;表示請求URL2、method&#xff1a;表示請求方法3、params&#xff1a;表示請求參數4、headers&#xff1a;表示請求頭 【例如】&#xff1a;RequestMapping(value"/testRequestMapping",…

【ZBH選講·拍照】

【問題描述】 假設這是一個二次元。LYK召集了n個小伙伴一起來拍照。他們分別有自己的身高Hi和寬度Wi。為了放下這個照片并且每個小伙伴都完整的露出來&#xff0c;必須需要一個寬度為ΣWi&#xff0c;長度為max{Hi}的相框。&#xff08;因為不能疊羅漢&#xff09;。LYK為了節省…

php基礎是什么,php基礎學什么?

有不少同學想要學習 PHP&#xff0c;但又不清楚 PHP 基礎學什么&#xff0c;那么這篇文章告訴你。熟悉前端開發語言學習 PHP 之前&#xff0c;首先要學習前端語言包括 HTML、CSS、JS 等。等對前端語言有個大致掌握后&#xff0c;能編寫一個 web 靜態頁面。學習 PHP 基本語法和函…

名為 cursor_jinserted 的游標不存在_生鮮電商存在的問題及對策解析:未來生鮮電商如何發展?...

生鮮電商的特點有哪些&#xff1f;生鮮電商特點&#xff1a;1,生鮮電商具有粘性高、重復購買率高、毛利高的“三高”特性&#xff1b;2,生鮮食品需要保鮮、冷藏、冷凍&#xff1b;3,生鮮食品保質期比較短&#xff1b;保存不易、對物流配送的條件要求極高&#xff1b;4,生鮮商品…

遇到短信轟炸,別人換ip調你的短信接口怎么辦

前端開發者很容易暴露自己的請求地址和參數&#xff0c;我們都知道&#xff0c;一個h5頁面&#xff0c;按 F12 是可以看到頁面的源碼的&#xff0c;所以經常很多人會利用這一點惡意調取別人的接口。 我們公司出現了好多次短信接口被大量調用&#xff0c;導致一天發了幾萬條短信…