<?php
ini_set('max_execution_time', 86400); // 86400 = 60 * 60 * 24 seconds = 24 Hours
$start = microtime();
/*
Script_name : mysqlworking.php
Source_code : http://www.thaiall.com/perlphpasp/source.pl?9116
Version 7.2563-09-25
คำเตือน : เมื่อได้ code จะต้อง save as เป็น utf8 จึงจะแสดงผลภาษาไทยใน webpage ได้ถูกต้อง
# ===
Update Description
- ใช้คำสั่ง join fields
- เพิ่ม font kanit ของ google
- ปรับ properties เป็น style ทั้งหมด
- ตรวจสอบ phpversion() และ iconv() ทำเงื่อนไขรองรับ 5gbfree.com (php 7.1.8 mysql 5.0.12) ที่ไม่บริการ iconv()
- ปรับเป็น mysqli แทน mysql เพื่อให้ใช้งานกับ 000webhosting.com (php 7.1.7 mysql 5.0.12)
- เพิ่มลักษณะข้อมูลเป็น ตัวอักษรภาษาไทย และภาษาอังกฤษ เมื่อ insert 1000 ผ่าน การแปลงตัวอักษรด้วย iconv();
- เพิ่มการควบคุมตัวอักษรพิเศษ เปิดปิดการป้องกัน SQL Injection ผ่านตัวแปร $protect_sql_injection สำหรับกการ search
- เพิ่มการตรวจสอบ keyword สำหรับ findname ต้อง > 1 ตัวอักษร
- ตารางที่สร้างกำหนด COLLATION คือ การจัดเรียงและเปรียบเทียบเป็นแบบ ด้วย COLLATE utf8_unicode_ci
- ปรับให้ทำงานกับ UTF-8 ตั้งแต่สร้างตาราง ด้วย CHARSET=utf8
- ย้ายปุ่ม Delete Table ไปไว้ด้านหลัง และปรับสี
- ปรับให้ใช้กับ XAMPP บน Local host [xampp-win32-5.6.31-0-VC11-installer]
- ปรับให้ใช้กับ Palapa Web Server บน Smartphone
- ปรับให้ใช้กับ Thaiabc.ueuo.com บน Free web hosting
- เพิ่มปุ่มให้สร้าง Table ได้ทั้ง innodb และ myisam
- เปลี่ยนวิธีติดต่อ Database ตามข้อกำหนดใน php 5.4.4 บน xampp for windows 1.8.0
จาก $result = mysql_db_query($db,$query); เป็น mysql_select_db($db,$connect); และ $result = mysql_query($query,$connect);
- เริ่มพัฒนาในปี 2547 เพื่อใช้งานร่วมกับข้อมูลใน Microsoft Excel
- https://gist.github.com/thaiall/6a360c71ef95193864fcea2eb7f52e8b
# === */
/* Section 1 : Configuration */
// 1.1 Main configuration
$host = 'localhost';
$db = 'mysql'; // please change for the implementation
$tb = 'car';
$user = 'root'; // for xampp Web Server
$password = ''; // for xampp Web Server
// $user = 'root'; // for Palapa Web Server
// $password = 'adminadmin'; // for Palapa Web Server
// 1.2 Security option
$protect_sql_injection = false; // true = safe; false = unsafe
$phpinfo_function_allow = true; // true = can use phpinfo()
// 1.3 Database connection
$connect = new mysqli($host,$user,$password,$db);
if ($connect->connect_error) die("Connection Database :failed");
$result = $connect->query("show tables like '$tb'");
$tb_found = $result->num_rows;
// 1.4 phpinfo function
if (isset($_GET{'action'}) && ($_GET{'action'} == "phpinfo") && ($phpinfo_function_allow == true)) {
phpinfo();
exit;
}
// 1.5 start html
echo '<html><head><title>Mysql Working</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Kanit" />
<style type="text/css">
body{font-family:kanit;}
textarea{font-size:10px;color:blue;scrollbar-base-color:red;scrollbar-arrow-color:white;background-color:#ffffdd;}
input{font-family:kanit;font-size:16px;color:black;background:#ffffdd;}
</style></head><body>';
?>
<!-- Section 2 : Menu screen -->
<form action="" method="post">
<table style="background-color:blue;border-width:15px;border-style:solid;width:740px;margin-left:auto;margin-right:auto;text-align:center;">
<?php if ($tb_found == 0) { ?>
<tr><td style="background-color:white">
<input type="submit" value="Create table InnoDB" name="action" style="width:320px;height:50px;">
<input type="submit" value="Create table MyISAM" name="action" style="width:320px;height:50px;">
</td></tr>
<?php } else { ?>
<tr><td style="vertical-align:top;background-color:white;width:100;text-align:center;">
<input type="submit" value="post 1000" name="action" style="width:100px;background-color:yellow;">
<input type="submit" value="post_recs" name="action" style="width:100px;background-color:#dddddd;">
<input name="recs" value="1000" size="6">
</td>
<td style="background-color:#dddddd"><input type="submit" value="postmany" name="action" style="width:100px;background-color:#ddffdd;">
ข้อมูลข้างล่างนี้สามารถ copy จาก excel มา paste ได้<br/>
<textarea name="manyrecord" rows="4" cols="120" wrap="off">
1 2547 หจก. กองเกตุเอ๊กซ์เปรส 20 11 2551 8/1 ม.2 แขวงทุ่งครุ ทุ่งครุ กรุงเทพฯ 17 14 3 1 3
2 2547 หจก. ดาวคะนองการท่องเที่ยว 5 1 2552 10/223 ม.4 แขวงดินแดง ห้วยขวาง กรุงเทพฯ 2 2 3
3 2547 บจ. ธรรมนูญ โพธิ์ทอง 5 1 2552 1407/6 ซ.ตากสิน 7 ถ.สมเด็จพระเจ้าตากสิน แขวงบุคคโล สายไหม กรุงเทพฯ 4 2 2 3
4 2547 บจ. นิติพงษ์ ไพบูลย์ทรานสปอร์ต 6 1 2552 15/20 ถ.นวลจันทร์ แขวงคลองกุ่ม สายไหม กรุงเทพฯ 1 1 3
5 2547 นาย บางแคการท่องเที่ยว 6 1 2552 209/718 ม.ปรีชา 8 ถ.รามคำแหง แขวงหัวหมาก สะพานสูง กรุงเทพฯ 1 1 3
6 2547 นาย ผาน ตอลบรัมย์ 6 1 2552 4/33 ม.6 แขวงสายไหม สวนหลวง กรุงเทพฯ 1 1 3
7 2547 บจ. วิจิตรประกอบ 7 1 2552 25 ซ.อ่อนนุช 10 ถ.อ่อนนุช แขวงสวนหลวง ลาดพร้าว กรุงเทพฯ 02-2743222-3 3 3 3
8 2547 หจก. สตาร์แปซิฟิคทรานสปอร์ต 26 1 2552 41/9 ม.9 ถ.วิภาวดีรังสิต แขวงสีกัน บึงกุ่ม กรุงเทพฯ 21 1 19 1 3
9 2547 นาย สมนึก ผลดีนานา 12 1 2552 43 ซ.บรมราชชนนี 14 ถ.บรมราชชนนี แขวงบางบำหรุ บางพลัด กรุงเทพฯ 1 1 3
10 2547 บจ. สวัสดิภาพทัวร์ 13 1 2552 44/73 ม.7 แขวงลาดพร้าว บางกะปิ กรุงเทพฯ 2 2 3
11 2547 นาย สุชาติ ภรมงคลธรรม 13 1 2552 52/4 ม.13 ถ.กรุงเทพกรีฑา แขวงสะพานสูง บางกะปิ กรุงเทพฯ 1 1 3
12 2547 นาย เสวกทัวร์ 13 1 2552 55 ม.9 ซ.ปรีชา แขวงฉิมพลี ธนบุรี กรุงเทพฯ 1 1 3
13 2547 หจก. ไสว วรรณรังสี 24 1 2552 55/4 ม.3 ซ.ประชาอุทิศ 76 ถ.ประชาอุทิศ แขวงทุ่งครุ กรุงเทพฯ 10 10 3
</textarea>
</td></tr></table>
<table style="background-color:black;border-spacing:5px;text-align:center;width:760px;margin-left:auto;margin-right:auto;"><tr>
<td bgcolor="white" align="center"><input type="submit" value="listall" name="action" style="width:60px;background-color:#ffdddd;">
เริ่ม <input name="begin" value="0" size="1">
จำนวน <input name="total" value="100" size="2">
</td>
<td style="background-color:white;text-align:center;">
<input type="submit" value="findname" name="action"><input name="name" value="หจก." size="3" style="width:60px;background-color:#ffddff;">
</td>
<td style="background-color:white;text-align:center;">
<input type="submit" value="deleterecord" name="action" style="width:100px;background-color:#ddddff;">
<input name="did" value="1" size="1"><input name="dyear" value="2547" size="4">
</td>
<td style="background-color:white;text-align:center;">
<input type="submit" value="deletetable" name="action" style="width:100px;background-color:red;color:white;">
</td></tr>
<?php } ?>
</table>
</form>
<!-- Section 3 : Activity -->
<table style="background-color:gray;width:760px;margin-left:auto;margin-right:auto;">
<tr><td style="background-color:white;">
<?php
### Start of 10 Activity ###
if (isset($_POST{'action'})) {
###########################
# 1 # create table InnoDB
###########################
if ($_POST{'action'} == "Create table InnoDB") {
$field_ar=array("f1 CHAR(100)");
for ($i=2;$i<=27;$i++) array_push($field_ar, "f" . $i . " CHAR(100)");
$q_field = join(",",$field_ar);
$query = "CREATE TABLE $tb (" . $q_field;
$query .= ") engine = InnoDB default charset=utf8 collate=utf8_unicode_ci;";
echo $query."<br/>";
if ($connect->query($query) === TRUE) echo "process : completely<br/>"; else { echo "error to create table<br/>"; exit; }
echo "<meta http-equiv='refresh' content=\"3;URL='mysqlworking.php'\" />";
exit;
}
###########################
# 2 # create table MyISAM
###########################
if ($_POST{'action'} == "Create table MyISAM") {
$query = "CREATE TABLE $tb (";
for ($i=1;$i<=26;$i++) $query = $query . "f" . $i . " CHAR(100),";
$query .= "f27 CHAR(100)";
$query .= ") ENGINE = MyISAM DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;";
echo $query."<br/>";
if ($connect->query($query) === TRUE) echo "process : completely<br/>"; else { echo "error to create table<br/>"; exit; }
echo "<meta http-equiv='refresh' content=\"3;URL='mysqlworking.php'\" />";
exit;
}
###########################
# 3 # delete table
###########################
if ($_POST{'action'} == "deletetable") {
$query = "drop table $tb;";
if ($connect->query($query) === TRUE) echo "process : completely<br/>"; else { echo "table remove : error<br/>$query"; exit; }
echo "<meta http-equiv='refresh' content=\"3;URL='mysqlworking.php'\" />";
exit;
}
###########################
# 4 # search from keyword
###########################
if ($_POST{'action'} == "findname") {
if(strlen($_POST{'name'}) > 1) {
# SQL Injection Protection
$unsafe = $_POST['name'];
$safe_step1 = $connect->real_escape_string($unsafe); // for ' or 1=1 or '
$unwanted_word = array("'", "or", ";","=","_");
$removebyblank = '';
$safe_step2 = str_replace($unwanted_word, $removebyblank, $safe_step1);
# ส่วนนี้มีความอ่อนแอ (vulnerability) ที่ยังไม่ได้รับการป้องกัน
# ถูกโจมตีได้ด้วย SQL Injection for test ' or 1=1 or ' หรือ ___
# การค้นหานี้ใช้ % เพื่อใช้ค้นหาจากคำขึ้นต้น แล้วต่อท้ายด้วยอะไรก็ได้ คล้ายกับ * ใน DOS เช่น dir AN*.lnk จะพบ ANT.lnk และ AND.lnk
# การค้นด้วย _ ใน like หมายถึงตัวอักษรอะไรก็ได้ คล้ายกับ ? ใน DOS เช่น dir AN?.lnk จะพบ ANT.lnk
if(!$protect_sql_injection) {
$query = "select * from $tb where f4 like '". $_POST{'name'} ."%'";
} else {
$query = "select * from $tb where f4 like '". $safe_step2 ."%'";
}
if(!$protect_sql_injection || $safe_step1 == $safe_step2) {
$result = $connect->query($query);
if ($result === FALSE) { echo "Finding : error<br/>$query"; exit;}
while ($object = $result->fetch_object()) {
foreach ($object as $o) echo $o . " ";
# sample : echo $object->f26 . " " . $object->f27;
echo '<hr color=gray />';
}
} else {
echo '<b>Error</b> : found unwanted character';
}
} else {
echo '<b>Error</b> : Keyword required > 1 character';
}
}
###########################
# 5 # delete record
###########################
if ($_POST{'action'} == "deleterecord") {
$query = "delete from $tb where f1 = '". $_POST{'did'}."' and f2 = '". $_POST{'dyear'}."'";
$result = $connect->query($query);
$cnt_result = $connect->affected_rows;
if ($result === TRUE) echo "delete : ". $cnt_result ." records<br/>"; else { echo "delete : error<br/>$query"; }
}
###########################
# 6 # list all records
###########################
if ($_POST{'action'} == "listall") {
$query = "select * from $tb limit " . $_POST{'begin'} . "," . $_POST{'total'} ;
$result = $connect->query($query);
if ($result === FALSE) { echo "listing : error<br/>$query"; exit;}
echo "<ol start=" . ($_POST{'begin'} + 1) . ">";
while ($object = $result->fetch_object()) {
echo "<li>";
foreach ($object as $o) echo "$o ";
}
echo "</ol>";
}
###########################
# 7 # post records
###########################
if ($_POST{'action'} == "postmany") {
$getline = explode("\r\n",$_POST{'manyrecord'});
for ($j=0;$j<count($getline);$j++) {
$l = $j + 1;
$getfield = explode("\t",$getline[$j]);
# echo "$l $getfield[0] - $getfield[26]<br/>";
}
if ($connect) {
echo "post from textarea : completely<br/>";
for ($j=0;$j<count($getline);$j++) {
if (strlen($getline[$j]) > 1) {
$l = $j + 1;
$getfield = explode("\t",$getline[$j]);
$field_ar=array("'$getfield[0]'");
for ($i=1;$i<=26;$i++) array_push($field_ar, "'$getfield[$i]'");
$q_field = join(",",$field_ar);
$query = "insert into $tb values(". $q_field .");";
echo $query."<br/>";
$result = $connect->query($query);
}
}
} else {
echo "connect : fail";
}
}
###########################
# 8 # post 1000
###########################
if ($_POST{'action'} == "post 1000") {
if ($connect) {
echo "Post 1000 : completely";
for ($j=0;$j<1000;$j++) {
if(!function_exists("iconv")) {
$c1 = chr(rand(65,91));
$c2 = chr(rand(65,91));
$c3 = chr(rand(65,91));
} else { //phpversion()
$c1 = iconv("TIS-620","UTF-8",chr(rand(161,206))); // 196 = ฤ ทำให้มี 45 ตัว
$c2 = iconv("TIS-620","UTF-8",chr(rand(161,206)));
$c3 = iconv("TIS-620","UTF-8",chr(rand(161,206)));
}
// https://www.ireallyhost.com/kb/other/173
$query = "insert into $tb (f1,f2,f4) values( $j , $j, '" . $c1.$c2.$c3 . "');";
// insert into $tb (f4) values('" . chr(161) . "') ภาษาไทยมีปัญหา แบบนี้ใช้ไม่ได้ใน MySQL เพราะไม่เป็น UTF8
$result = $connect->query($query);
}
} else {
echo "connect : fail";
}
}
// echo iconv("TIS-620","UTF-8",chr(161)); // output = ก
// echo ord(iconv("UTF-8","TIS-620","ก")); // output = 161
###########################
# 9 # post_recs
###########################
if ($_POST{'action'} == "post_recs") {
if ($connect) {
echo "Post " . $_POST{'recs'} ." : completely";
// echo "iconv:" . function_exists("iconv"); // 000webhosting.com จะ return 1 กลับมา
for ($j=0;$j<$_POST{'recs'};$j++) {
if(!function_exists("iconv")) { // ป้องกันการเรียกใช้ iconv ที่ 5GBFree.com
$c1 = chr(rand(65,91));
$c2 = chr(rand(65,91));
$c3 = chr(rand(65,91));
} else {
$c1 = iconv("TIS-620","UTF-8",chr(rand(65,91))); // ที่ 5GBFree.com หากเรียกใช้ iconv จะหยุดการทำงาน
$c2 = iconv("TIS-620","UTF-8",chr(rand(65,91))); // ตรวจสอบการ support ของ iconv ด้วย phpinfo() ได้
$c3 = iconv("TIS-620","UTF-8",chr(rand(65,91)));
}
$query = "insert into $tb (f1,f2, f4) values( $j , $j, '" . $c1.$c2.$c3 . "');";
$result = $connect->query($query);
}
} else {
echo "connect : fail";
}
}
###########################
# 10 # Total records
###########################
$query = "select * from $tb";
$result = $connect->query($query);
echo "<hr style='display:block;height:1px;border:0;border-top:1px solid#ccc;margin:1em0;padding:0;' />
Total records : ". $result->num_rows;
mysqli_free_result($result);
$connect->close();
### Stop of 10 Activity ###
} // end of isset : action from post
?>
</td></tr></table>
<!-- Section 4 : Introduction -->
<table style="margin-left:auto;margin-right:auto;width:760px;border-width:5px;border-style:solid;">
<tr><td style="background-color:#ddffdd;">
<fieldset><legend><b>Suggestion about this script</b></legend>
<ol>
<li>กำหนดชื่อฐานข้อมูลให้กับตัวแปร <font color="red">$db</font> ให้ตรงกับที่มีในระบบฐานข้อมูล MySQL หรือ MariaDB
<br/>ที่กำหนดไว้คือ [mysql] เพราะเป็น Default database ถ้าใช้งานจริงก็ต้องสร้าง database ของตนเอง</li>
<li>เปลี่ยนค่าของตัวแปร <font color="red">$user และ $password</font> ให้ตรงกับรหัสผู้ใช้ที่เข้าใช้งาน MySQL ได้</li>
<li>กดปุ่ม Create table เพื่อสร้างตารางชื่อ car ในฐานข้อมูล [mysql]</li>
<li>หลังสร้างตารางแล้ว ก็กดปุ่ม postmany เพื่อสร้างข้อมูล จะได้มีข้อมูลไว้ใช้ทดสอบ</li>
<li>ถ้าทดสอบการใช้งานด้วยค่า default ได้แล้ว ก็ควรสร้าง database, table ขึ้นมาใช้งานเอง</li>
<li>ปกติจะกำหนด max time ที่ 30 seconds ใน code จะขยายเวลาเป็น 24 ชั่วโมง รองรับ insert 1000</li>
<li>ถ้ามีปัญหาภาษาไทยต้องใช้ Editor ปรับ file encoding = UTF-8</li>
<li>ถ้าไม่กำหนด Engine ให้ DB จะสร้างเป็น InnoDB ซึ่ง insert record จะตอบสนองช้าเมื่อเทียบกับ MyISAM</li>
<?php if($phpinfo_function_allow) { ?>
<li>เรียกใช้ <a href="?action=phpinfo">phpinfo()</a> เพื่อดูค่าต่าง ๆ ของ server เช่น version ของ php หรือ mysql
<?php } ?>
</ol>
</fieldset>
</td></tr>
<tr><td style="background-color:white;">
<?php
$demo = array("http://thaiabc.ueuo.com/",
"http://thaiabc.000webhostapp.com/mysqlworking.php",
"http://thaiabc.5gbfree.com/mysqlworking.php",
"http://thaiabc.byethost22.com/mysqlworking.php",
"http://thaiabc.atwebpages.com/mysqlworking.php");
for($demo_no=0;$demo_no<count($demo);$demo_no++) {
echo "<b>Demo site</b> : <a href='$demo[$demo_no]'>$demo[$demo_no]</a><br/>";
}
list($u_start,$s_start) = explode(" ",$start);
list($u_stop,$s_stop) = explode(" ",microtime());
$tstart = $u_start + $s_start;
$tstop = $u_stop + $s_stop;
echo "Page loading in " . ($tstop - $tstart) . " seconds";
?>
</td></tr></table>
</body></html>
จำนวน : 347 บรรทัด