iT邦幫忙

0

把sql的搜尋語句直接寫進資料庫

  • 分享至 

  • xImage

如題,我想做一個搜尋歷程記錄,把下給sql去資料庫撈資料的句子,再寫回資料庫,這樣就下次要查就可以直接撈出來了,但不知道是不是不能這麼做,或是我語法有問題,請大大賜教。

<?php require_once('db/db.php');
error_reporting(E_ALL || ~E_NOTICE);
session_start();
$id=$_SESSION['id'];
?>
<?php
echo "<div class='a'><font color= red size='5pt'>查詢資料</font></div><br><br>"; 
?>
<!--搜尋表單-->
<div>
<form method = "POST">
a : <input type="text" name="a" id="a">    
b : <input  type="text"  name="b" id="b">
c : <input type="text"  name="c" id="c">
<input type="submit" name="find" value="查詢">
<input type="submit" name="save" value="儲存">
</form>

</div>
<!--抓資料庫-->
<?php
$sql = "select * from aa ";
$keyName = ['a','b','c'];
$list = [];
foreach($keyName AS $_key){
	if(isset($_POST[$_key]) && $_POST[$_key]){
		$list[] = $_key." = '$_POST[$_key]'";}}	
if($list){
	$sql .= ' where '.implode(' and ',$list);}
if (isset($_POST["find"])){
$result = $project->query($sql);
$row = $result->fetchALL(PDO::FETCH_ASSOC);
$row_cnt = $result->rowCount();
?>
<div>
<?php
if($row_cnt==0){
	echo "沒有相似品項";}
else{
	echo "</br>"; 
	echo "<table  border='1' width='100' height='100'>";
	echo "<tr>";
	echo "<th>a</th>";
	echo "<th>b</th>";
	echo "<th>c</th>";
	echo "</tr>";		
	foreach($row as $row1){
	echo "<tr>";
	foreach($row1 as $key => $value){
	echo "<td>".$value."</td>";
	}
	echo "</tr>";
	}
echo "</table>";
}}
if (isset($_POST["save"])){
	$a=$sql;
	$search="select * from a where history = '$a'";
	$result = $project->query($search);
	$row1 = $result->fetchALL(PDO::FETCH_ASSOC);
	$row_cnt1 = $result->rowCount();
	if($row_cnt1 > 0){
		echo '此筆資料已存在';}
	else{
       	$sql1 = "insert into search_history history values '$a'";
		$result1 = $project->query($sql1);
		$row = $result1->fetch(PDO::FETCH_ASSOC);
        echo '新增成功!';
	}
}
?>
</div>

https://ithelp.ithome.com.tw/upload/images/20220829/20148269dRN4uhJlUh.pnghttps://ithelp.ithome.com.tw/upload/images/20220829/20148269XOIIk2vmqw.png
更新:剛試了一下,好像是因為sql搜尋出來結果是

select * from aa where a = '1'

的''存不進去,要另外寫成

select * from aa where a = \'1\'

才存得進去,請問還有其他方法可以完整寫進去再拉出來的方法嗎,還是要先用語法加\,到時候取出來再去\

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
淺水員
iT邦大師 6 級 ‧ 2022-08-29 15:34:35
最佳解答

用字串連接的方式組 SQL 的話
要處理那些特殊字元很麻煩也滿危險的
上次一樣推薦用 prepare + bindParam(bindValue) + execute 處理

可參考:https://ithelp.ithome.com.tw/articles/10183166

淺水員 iT邦大師 6 級 ‧ 2022-08-29 16:24:41 檢舉

例如

$search="select * from a where history = '$a'";
$result = $project->query($search);

改成

$search = "select * from a where history = :a";
$stmt = $project->prepare($search);
$stmt->bindParam(':a', $a);
$result = $stmt->execute();

感謝淺水員大大的回答~

1
wilson1966
iT邦研究生 1 級 ‧ 2022-08-29 16:07:38

存的時候先用$的符號來取代 ' 單引號,再儲存入資料庫裡
讀的時候再將$的符號用 ' 單引號來取代

感謝wilson大大的回答~

0
ckp6250
iT邦好手 1 級 ‧ 2022-08-29 16:58:59

看不出來這樣做的目的何在?

wilson1966 iT邦研究生 1 級 ‧ 2022-09-02 08:25:24 檢舉

目的-->節省時間。
以前我也有想過將Form 裡主要SQL 都寫在DB 裡,這樣USER 反應有問題(SQL 問題)時,直接改DB 裡的SQL,改好再回存即可,快速又方便。

我要發表回答

立即登入回答