如題,我想做一個搜尋歷程記錄,把下給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>
更新:剛試了一下,好像是因為sql搜尋出來結果是
select * from aa where a = '1'
的''存不進去,要另外寫成
select * from aa where a = \'1\'
才存得進去,請問還有其他方法可以完整寫進去再拉出來的方法嗎,還是要先用語法加\,到時候取出來再去\
用字串連接的方式組 SQL 的話
要處理那些特殊字元很麻煩也滿危險的
跟上次一樣推薦用 prepare + bindParam(bindValue) + execute 處理
可參考:https://ithelp.ithome.com.tw/articles/10183166
存的時候先用$的符號來取代 ' 單引號,再儲存入資料庫裡
讀的時候再將$的符號用 ' 單引號來取代
看不出來這樣做的目的何在?