ホームページ >バックエンド開発 >PHPチュートリアル >mysql 操作クラス、v0.2、大量のデータを処理するためのソリューションを追加

mysql 操作クラス、v0.2、大量のデータを処理するためのソリューションを追加

WBOY
WBOYオリジナル
2016-07-25 09:06:191039ブラウズ
/*mysql の単純なクラス by joffe q89949401 bib@Crazycode 詩人; このクラスは完全に静的です。使用する場合は、直接インクルードして mysql::method() 名を使用します。クラスは php5 でグローバルに表示されるため、コメントがある場合は変数のスコープを気にする必要はありません。プライベート メッセージ ||qq メールを送信してください。 現在、ストアド プロシージャに関連するメソッドはありません。もちろん、ストアド プロシージャは通常、データベースを作成するときに実行されます。 構成ファイルでは、次の定数情報を構成する必要があります。 LIB: クラスの保存場所 DEBUG:デバッグを有効にするかどうか(有効にするとエラー情報追跡が出力されます) TB_EX: データベーステーブルのプレフィックス。

select del update insert big_select big_del 関数を追加しました

*/
  1. /*mysql simple class by joffe q89949401 bib@Crazycode quote;
  2. このクラスが完全に静的に使用される場合は、クラスがグローバルであるため、直接インクルードし、mysql::method() 名を使用します。 php5 可視なので、変数のスコープを気にする必要はありません。コメントがある場合は、プライベート メッセージを送信してください ||qq メール;
  3. ストアド プロシージャに関連するメソッドは現在ありません。
  4. データベース作成時に設定が必要な設定ファイル 以下の定数情報:
  5. LIB: クラスの格納場所
  6. DEBUG: デバッグを有効にするかどうか (有効にするとエラーメッセージの追跡が出力されます)
  7. TB_EX: データベーステーブルのプレフィックス;
  8. */
  9. define('LIB') または die('Missing config!! ');
  10. final class mysql {
  11. /**
  12. * クエリの合計数
  13. *
  14. * @var int
  15. */
  16. public static $querynum = 0; &*/
  17. public static $link;
  18. /*
  19. table prefix
  20. @var string 次のメソッドでは、テーブルのプレフィックスとして TB_EX を構成する必要があります
  21. */
  22. static function add_ex($tb){
  23. return TB_EX.$tb_ex.$tb;
  24. }
  25. /*mysql データベースが厳密な型を使用するかどうか (mysql 型は自動的に変換されません) デフォルトは false で、mysql の型変換がオンになっていることを意味します。自動変換を行わない mysql の挿入関数の一重引用符。関連する関数は将来追加される可能性があります
  26. */
  27. public static $is_type_tight=false;
  28. /**
  29. * 接続ハンドル
  30. *
  31. * @var オブジェクト
  32. */
  33. static function connent($dbhost) , $dbuser, $dbpw, $dbname = "",$dbcharset, $pconnect = 0) {
  34. if($ pconnect) {
  35. if(!self::$link = @mysql_pconnect($dbhost, $dbuser, $dbpw )) {
  36. self::halt("MySQL サーバーに接続できません");
  37. }
  38. } else {
  39. if(!self::$link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
  40. self::halt("MySQL サーバーに接続できません");
  41. }
  42. }
  43. if(self::version () > "4.1") {
  44. if($dbcharset) {
  45. mysql_query("SETcharacter_set_connection={ $dbcharset},character_set_results=$dbcharset,character_set_client=binary", self::$link);
  46. }
  47. if( self::version() > "5.0.1") {
  48. mysql_query("SET sql_mode='') ", self::$link);
  49. }
  50. }
  51. if($dbname) {
  52. mysql_select_db($dbname, self::$link);
  53. }
  54. }
  55. /**
  56. * コンストラクター
  57. *
  58. * @param string $dbhost ホスト名
  59. * @param string $dbuser user
  60. * @param string $dbpw パスワード
  61. * @param string $dbname データベース名
  62. * @param int $pconnectつながり
  63. */
  64. 静的関数 select_db ($dbname) {
  65. return mysql_select_db($dbname, self::$link);
  66. }
  67. /**
  68. * データベースを選択
  69. *
  70. * @param string $dbname
  71. * @return
  72. */
  73. static function fetch_array($query, $result_type = MYSQL_ASSOC) { //デフォルトでは、数値配列ではなく、連想配列がフェッチされます。 = $type == "UNBUFFERED" && @function_exists("mysql_unbuffered_query")
  74. "mysql_unbuffered_query" : "mysql_query"
  75. if( !($query = $func($sql, self::$link)) && $type != "SILENT") {
  76. self::halt("MySQL クエリ エラー", $sql);
  77. self:: $querynum++
  78. }
  79. /**
  80. * 結果セットからレコードを取得します
  81. *
  82. * @param object $query
  83. * @param int $result_type
  84. * @return array
  85. */
  86. static関数影響を受ける_rows() {
  87. return mysql_affected_rows(self::$link);
  88. }
  89. /**
  90. * 查询SQL
  91. *
  92. * @param string $sql
  93. * @param string $type
  94. * @return object
  95. */
  96. static 関数 error() {
  97. return ((self::$link) ? mysql_error(self:: $link) : mysql_error());
  98. }
  99. /**
  100. * 影響を受けるアイテムの数を取得します
  101. *
  102. * @return int
  103. */
  104. static 関数 errno() {
  105. return intval((self::$link) ? mysql_errno(self::$link) : mysql_errno( ));
  106. }
  107. /**
  108. * エラーメッセージを返す
  109. *
  110. * @return array
  111. */
  112. 静的関数 result($query, $row,$flname=0 ) {
  113. $query = @mysql_result($query, $row,$flname); $query;
  114. }
  115. /**
  116. * エラーコードを返す
  117. *
  118. * @return int
  119. */
  120. 静的関数 num_rows($query) {
  121. $query = mysql_num_rows( $query);
  122. /**
  123. * クエリ結果を返す
  124. *
  125. * @param object $query
  126. * @param string $row
  127. * @returnmixed
  128. */
  129. 静的関数 num_fields($query) {
  130. return mysql_num_fields($query);
  131. /**
  132. * 結果の数
  133. *
  134. * @param object $query
  135. * @return int
  136. */
  137. static 関数 free_result($query) {
  138. return @mysql_free_result($query);
  139. /**
  140. * 自動インクリメント ID を返す
  141. *
  142. * @return int
  143. */
  144. 静的関数 insert_id() {
  145. return ($id = mysql_insert_id(self::$link)) >= 0 ? $id : self::$result(self::$query("SELECT last_insert_id()"), 0);
  146. }
  147. /**
  148. * 結果セットから列挙型配列として行を取得します
  149. *
  150. * @param object $query
  151. * @return array
  152. */
  153. 静的関数 fetch_row($query) {
  154. $query = mysql_fetch_row($query);
  155. $query を返す;
  156. }
  157. /**
  158. * 結果セットから列情報を取得し、オブジェクトとして返します
  159. *
  160. * @param object $query
  161. * @return object
  162. */
  163. 静的関数 fetch_fields($query) {
  164. return mysql_fetch_field($query);
  165. }
  166. 静的関数 select_affectedt_rows($rs){
  167. return mysql_affected_rows($rs,self::$link);
  168. }
  169. /**
  170. * mysql バージョンを返す
  171. *
  172. * @return string
  173. */
  174. 静的関数 version() {
  175. return mysql_get_server_info(self) ::$リンク);
  176. }
  177. /**
  178. * 近い接続
  179. *
  180. * @return bool
  181. */
  182. 静的関数 close() {
  183. return mysql_close(self::$link);
  184. }
  185. /**
  186. * エラーメッセージを出力します
  187. *
  188. * @param string $message
  189. * @param string $sql
  190. */
  191. static function halt($message = "", $sql = "") {
  192. @header("Content-type: text/html; charset=utf-8");
  193. if (DEBUG==1){
  194. $debug = debug_backtrace();
  195. echo $message 。 "rn
    SQL--> " . $sql."rn
    ERROR_MESSAGE-->".self::error().
  196. "rn
    --------------デバッグ--- -----------rn
    ";
  197. self::echoarray($debug);
  198. echo "rn
    ----------- -デバッグ終了----------------";
  199. }else{
  200. echo 'SQL エラー';
  201. }
  202. @self::rollback();
  203. exit;
  204. }
  205. ///////////////////// ////////以下は展の sql メソッドです。//////
  206. /* 数組照合 key value value の对应系插入データテーブル中
  207. テーブルに必要なデータテーブル
  208. 要注意メソッドは自己给表に追加されたものです。
  209. */
  210. static function insert($table,$array){
  211. $temp="";$temp2='';
  212. foreach($array as $key=> $value){
  213. if(self::$is_type_tight){
  214. if(is_string($value)){
  215. $temp .="$key,";$temp2 .="'$value',";
  216. }elseif (is_int($value||is_null($value)||is_float($value))){
  217. $value+=0;
  218. $temp .="$key,";$temp2 .="'$value'," ;
  219. }
  220. }else{
  221. $temp .="$key,";$temp2 .="'$value',";
  222. }
  223. }
  224. $temp = substr($temp,0,strlen($temp) -1);
  225. $temp2 = substr($temp2,0,strlen($temp2)-1);
  226. $sql = "INSERT INTO $table ($temp) VALUE($temp2)";
  227. return self:: query($sql);
  228. }
  229. 静的関数 del($table,$where){
  230. $sql = "DELETE FROM {$table} where {$where}";
  231. return self::query($sql) ;
  232. }
  233. static 関数 update($table,$array,$where){
  234. foreach ($array as $key=>$value){
  235. $temp .= "$key='$value',";
  236. }
  237. $temp = substr($temp,0,strlen($temp)-1);
  238. $sql = "update {$table} set ($temp) where {$where} ";
  239. return self::query " where:XXX" は where 条件です;
  240. 如果写上 "xxx" 如意は键值
  241. 如果写上 "by:XXX" は排序
  242. 如果写上 "limit:xxx,xxx" は分页です
  243. #パラメータ不正确则はfalseを返します; 成功した場合は評価後の数組;
  244. */
  245. static function select(){
  246. $numargs = func_num_args();//获取パラメータ数;
  247. $where = "";$key="";$limit=" ";$by="";
  248. if($numargs==0){return false;}
  249. //echo $numargs;
  250. if($numargs>=2){
  251. $arg_list = func_get_args();
  252. $table = $arg_list[0];
  253. unset($arg_list[0]);
  254. // print_r($arg_list);
  255. foreach($arg_list as $k=>$value){
  256. if(preg_match("#^( where:)w#",$value)){
  257. $temp =explode(":",$value);
  258. $where = "WHERE {$temp[1]} " ;
  259. }elseif(preg_match("#^ by:w#",$value)){
  260. $temp =explode(":",$value);
  261. $by = "{$temp[1]} で注文" ;
  262. }elseif(preg_match("#^ limit:w#",$value)){
  263. $temp =explode(":",$value);
  264. $limit = "limit {$temp[1]}";
  265. }else{
  266. $key .= " $value,";
  267. }
  268. }
  269. if($key==""){
  270. $key = "*";
  271. }else{
  272. $key =substr($key,0,strlen($key)- 1);
  273. }
  274. $sql_base="SELECT $key FROM $table";
  275. }
  276. if(!empty($where)){
  277. $sql_base .= " $where";
  278. }
  279. if(!empty($by) ){
  280. $sql_base .= " $by";
  281. }
  282. if(!empty($limit)){
  283. $sql_base .= " $limit";
  284. }
  285. //echo $sql_base;
  286. //echo $by ;
  287. $rs = self::query($sql_base);
  288. $re=array();
  289. if(self::num_rows($rs)>=1){
  290. while($info = self::fetch_array($rs)){
  291. $re[]=$info;
  292. }
  293. }
  294. self::free_result($rs);
  295. return $re;
  296. }
  297. /*回滚事务*/
  298. static function rollback(){
  299. self::query('rollback');
  300. }
  301. /*开始事务*/
  302. static function begin(){
  303. self::query('SET AUTOCOMMIT =0'); //停止用自動提交;
  304. self::query('BEGIN') ;//开始一事务;
  305. }
  306. /*提交事务*/
  307. static function commit(){
  308. self::query('commit' );
  309. }
  310. 静的関数 echoarray($array){
  311. foreach($array as $k=>$v ){
  312. if(is_array($v)){
  313. if(is_array($v)){
  314. エコー "
    --------------------------------
    ";
  315. self::echoarray($v);
  316. }
  317. }else{
  318. if($k==='line')
  319. echo "$k -> " .$ v." ";
  320. else
  321. echo "$k -> " .$v." ";
  322. }
  323. }
  324. }
  325. function get_server_info(){
  326. return mysql_get_server_info();
  327. }
  328. //下は应付大データの表の拡張蟥询です
  329. /*
  330. big_select は大规模用の蟥询に適合し、覆いインデックスを利用して大幅なオフセット活性化口、令状は覆いインデックス上に偏移されません。すべてのデータで、データ上の msql を減らし、他のデータを追加すると、効率が向上します。ただし、小規模なデータの場合は、この逆に、制限が 100 に達すると、その結果、強度が増加します。 00 ,20;mysql 会先查出 10020 条データさらに 10000 この操作代は非常に大きく、この関数を利用することで高い効果が得られますが、結果が制限 20 である場合、那就会稍微比直接選択遅いいくつか
  331. @table 文字列要監査対象の表 例: "table1"
  332. @keys string 要監査対象の鍵,複数の鍵使用","分割 例:"key1,key2,key3" 结束不含","少量用"*" およびいくつかの鍵请加上`;
  333. @Index string 主インデックス键または唯一のインデックス键名、ただ必要な 1 つの例 "id";
  334. @pagesize int 分页大小、必须、你不会想这么多数データ全部出来吧
  335. @pageNo 页コード、从0开開始
  336. @orderby string 排序 例: "id desc";可空,ただし不建议空
  337. @where 文字列条件 例: "date>122424533" 可空
  338. # 返回数组
  339. */
  340. static function big_select($table,$キー,$index,$pagesize,$pageNo,$orderby=NULL,$where=NULL){
  341. $start=$pageNo*$pagesize;
  342. if($where){
  343. $sqlIndex="SELEECT {$index} from {$table} where {$where}";
  344. }else{
  345. $sqlIndex="SELEECT {$index} from {$table}";
  346. }
  347. if($orderby){
  348. $sqlIndex .=" ORDER BY { $orderby} $start,$pagesize を制限します";
  349. }else{
  350. $sqlIndex .=" ORDER BY Limit $start,$pagesize";
  351. }
  352. $sql = "SELECT $keys FROM {$table} INNER JOIN({$sqlIndex}) AS lim USING({$index} })";
  353. $rs = self::query($sql);
  354. $re=array();
  355. if(self::num_rows($rs)>=1){
  356. while($info = self::fetch_array($rs)){
  357. $re[]=$info;
  358. }
  359. }
  360. self::free_result($rs);
  361. return $re;
  362. }
  363. /* 如果一个很大的データ(万行よりも大きい予定) 削除される動作周期は長すぎるため、そのテーブルまたは実行に長時間かかると、起動されていないデータがいくつか削除されます。 以下の方法は、大量の SQL タスクを実行することです。小さい (1 回あたり 5000 行) が、次の操作により空きスロット期間中に新しいデータが挿入される可能性がありますが、新しいデータは十分な条件により削除される可能性があります。この方法では時間が経過するとすぐに失われます。の表名
  364. @where 文字列条件は省略可能
  365. #int 删除削除の行数
  366. */
  367. static function big_del($table,$where){
  368. set_time_limit(0);
  369. $sql="{$table} から削除where {$where} 制限 5000";
  370. $rows = 0;
  371. $eff=0;
  372. do{
  373. self::query($sql);
  374. $rows=self::affected_rows();
  375. $eff += $rows;
  376. }while($rows>0);
  377. return $eff;
  378. }
  379. }
  380. ?>
复制代

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。