เอาคำในไฟล์ CSV มาเปรียบเทียบในฐานข้อมูล แต่ติดว่าต้องการให้คำที่ใกล้เคียงแสดงด้วย
อัพโหลดไฟล์ csv เข้ามาแล้วเปรียบเทียบกับในฐานข้อมูลว่ามีคำนั้นอยู่หรือไม่ ถ้ามีก็แสดงเครื่องหมายถูก และ แสดงคำที่ใกล้เคียงกันออกมาด้วย
ปัญหาคือ ติดตรงให้แสดงคำที่ใกล้เคียงกันออกมาด้วย เหมือน LIKE แหละครับ แต่ผลลัพธ์มันยังไม่แสดงคำใกล้เคียงออกมาด้วย
ในไฟล์ csv
อยากให้แสดงคำใกล้เคียงออกมาประมาณนี้
อ่านไฟล์ csv ที่อัพเข้ามา อีกแถวคือแสดงคำที่ใกล้เคียงออกมาด้วย
Code (PHP)
<?php
// $db->query("TRUNCATE TABLE import"); //empty the table of its current records
//Upload File
if (isset($_POST['submit'])) {
if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
//echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded successfully." . "</h1>";
echo "<div class='alert alert-success alert-dismissible' role='alert'>
<button type='button' class='close' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'>×</span></button>
<strong>".$_FILES['filename']['name']."</strong> uploaded successfully.
</div>";
echo "<a href='#'><img src='image/excel.png'></a> << คลิกเพื่อดาวน์โหลดรายงาน";
echo '<table class="table table-hover table-bordered">
<thead>
<tr>
<th style="text-align: center; vertical-align: middle;" rowspan="2" width="6%"><br>ลำดับที่<br></th>
<th style="text-align: center; vertical-align: middle;" colspan="2" rowspan="2" width="40%"><br>รายการทรัพยากรการเรียนรู้</th>
<th style="text-align: center; vertical-align: middle;" rowspan="2" width="10%">รหัส</th>
<th style="text-align: center; vertical-align: middle;" rowspan="2" width="10%">จำนวนผู้เสนอ<br>ความต้องการ</th>
<th style="text-align: center;" colspan="2" width="15%">ผลการตรวจสอบทรัพยากร<br>การเรียนรู้ในฐานข้อมูล</th>
</tr>
<tr>
<th style="text-align: center;">มี</th>
<th style="text-align: center;">ไม่มี</th>
</tr>
</thead>';
//readfile($_FILES['filename']['tmp_name']);
}
$path = "uploads/";
$newfilename = date("dMY H-i-s");
$full_path = $path.$newfilename.".csv";
copy($_FILES['filename']['tmp_name'],$path.$newfilename.".csv"); //โฟลเดอร์สำหรับเก็บรูป/ไฟล์รูป
include 'excel.php';
//บันทึก filepath ลงฐานข้อมูล
$filepath = $db->prepare('INSERT INTO logs_file(filepath,date) VALUES(:filepath,NOW()) ');
$filepath->bindParam(':filepath',$full_path,PDO::PARAM_STR);
$filepath->execute();
$last = $db->lastInsertId();
//อ่านไฟล์ csv
$handle = fopen($_FILES['filename']['tmp_name'], "r");
$i=1;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
//encode เนื่องจากไฟล์ csv เป็น tis-620 ต้อง encode ใหม่ให้เป็น utf-8
$data0 = trim(iconv("tis-620","utf-8",$data[0])); // [0] คือ column แรกในไฟล์ csv
$data1 = trim(iconv("tis-620","utf-8",$data[1]));
//นำไปเรียบเทียบกับในตาราง datasearch6 ว่ามีอยู่หรือไม่
$check = $db->prepare('SELECT d_title,d_callno FROM datasearch_6 WHERE d_title = :data');
$check->bindParam(':data',$data0,PDO::PARAM_STR); //bindValue(1,"%$data0%",PDO::PARAM_STR);
$check->execute();
$row = $check->fetch(PDO::FETCH_ASSOC);
$rowCount = $check->rowCount();
$result = ($rowCount > 0) ? 'มี' : 'ไม่มี';
//บันทึกข้อมูลจากไฟล์ csv ลงฐานข้อมูล
$import = $db->prepare('INSERT INTO import(List,Num_offer,FK_filepath,result) VALUES(:data1,:data2,:last,:result) ');
$import->bindParam(':data1',$data0,PDO::PARAM_STR);
$import->bindParam(':data2',$data1,PDO::PARAM_STR);
$import->bindParam(':result',$result,PDO::PARAM_STR);
$import->bindParam(':last',$last,PDO::PARAM_STR);
$import->execute();
//แสดงข้อมูลจากไฟล์ csv ลงตาราง
echo "<tr>";
echo "<td style='text-align: center;'>".$i."</td>";
echo "<td colspan='2'>".iconv("tis-620","utf-8",$data[0])."</td>";
echo "<td>".$row['d_callno']."</td>";
echo "<td style='text-align: center;'>".iconv("tis-620","utf-8",$data[1])." คน</td>";
echo ($rowCount > 0) ? "<td style='text-align: center;'><span class='label label-success'>✔</span></td><td></td>" : "<td></td><td style='text-align: center;'><span class='label label-danger'>✘</span></td>";
echo "</tr>";
if ($rowCount > 0) {
$select = $db->prepare('SELECT d_title,d_callno FROM datasearch_6 WHERE d_title REGEXP :word');
//$k = "%".$data0."%";
$select->bindParam(':word',$data0,PDO::PARAM_STR);
$select->execute();
$ro = $select->rowCount();
while ($data = $select->fetch(PDO::FETCH_ASSOC)) {
echo "<tr><td colspan='7'>".$data['d_title']."</td></tr>";
}
}
$i++;
}
include 'excel.php';
$update = $db->prepare('UPDATE logs_file SET pathExcel_load = :load WHERE id = :last');
$update->bindParam(':load',$strFileName,PDO::PARAM_STR);
$update->bindParam(':last',$last,PDO::PARAM_STR);
$update->execute();
//ปิดการอ่านไฟล์ csv
fclose($handle);
//print "<br> <span class='text-success'>Import done</span>";
//view upload form
}
else {
print "อัพโหลด CSV ใหม่โดยการเรียกดูไฟล์และคลิกที่อัปโหลด<br />\n";
print "<form enctype='multipart/form-data' action='index.php' method='post'>";
print "กรุณาเลือกไฟล์:<br />\n";
print "<input size='50' type='file' name='filename' id='filename' accept='.csv'><br />\n";
print "<input type='submit' name='submit' id='submit' value='อัปโหลด' class='btn btn-primary' disabled /> </form>";
}
?>
ขอบคุณครับ Tag : PHP, MySQL, HTML/CSS, JavaScript, Ajax, jQuery
Date :
2015-10-29 14:46:13
By :
littlebeer
View :
3082
Reply :
2
ยากนะครับ ระบบแบบนี้ เพราะถ้าใช้ LIKE แค่สระหรืออักษร ต่างกัน ไม่ติดกัน มันก็หาไม่เจอล่ะ
Date :
2015-11-10 12:04:51
By :
mr.win
ก็อยู่ที่ว่า scope ในการแสดงคำที่ใกล้เคียงกัน จำนวนเท่าไหร่
ถ้าใช้ like ค่าที่น้อยกว่าจะไม่ออก
แบบกำหนดจำนวนเหมือน สูงต่ำ +/- 50 records
Code (SQL)
select * from (
select * from table where fieldname<'xxxxxx' order by fieldname limit 50 union all
select * from table where fieldname>='xxxxxx' order by fieldname limit 51
) as tmp order by fieldname
Date :
2015-11-10 12:27:50
By :
NewbiePHP
Load balance : Server 02