不好意思,我的語法是這樣,都已經是照抄原本UPDATE更新成功的程式碼了,只是換了另一個資料表和變數,結果按更新資料的時候卻沒有更新成功,不瞭解是變數設定的問題,還是PHP資料庫設定的問題?
<?php
header("Content-Type: text/html; charset=big5");
include("connMysql.php");
if (!@mysql_select_db("hmo")) die ("link fail");
mysql_query("SET NAMES 'big5'");
if(isset($_POST["action"])&&($_POST["action"]=="yes")){
$sql_query="UPDATE pharmacy
SET";
$sql_query.="cName2
='".$_POST["cName2"].",";
$sql_query.="cProcess
='".$_POST["cProcess"].",";
$sql_query.="cResult
='".$_POST["cResult"].",";
$sql_query.="cDoctor
='".$_POST["cDoctor"].",";
$sql_query.="cRecomment
='".$_POST["cRecomment"].",";
$sql_query.="cEnd
='".$_POST["cEnd"].",";
mysql_query($sql_query);
//重新導向回到主畫面
header("Location:hmo-pharmacy3.php");
}
$sql_db="SELECT * FROM pharmacy
WHERE cID
=".$_GET["id"];
$result=mysql_query($sql_db);
$row_result=mysql_fetch_assoc($result);
?>
你把sql字串印出來貼到mysql client或是phpmyadmin跑跑看就知道問題出在哪裡。
另外,你這樣組sql,會有sql injection的問題,至少要用mysql_real_escape處理一下再丟給sql。(等到php熟一點,可以考慮先使用pdo,利用它的prepared statement來減少sql injection的可能性。當然還有其他framework可以使用就是了,就看你的偏好囉。)
記錯函數名字而且前面講的不夠清楚,總之可以用mysql_real_escape_string($_POST['XXX'])處理過再丟進sql string。
不好意思,跑出來的錯誤是這樣
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$sql_query="UPDATE pharmacy
SET"' at line 1
請問專家,這一段應該插在上面語法的何處?mysql_real_escape_string($_POST['XXX'])
xxx指的是變數嗎?如cName、cProcess,然後要加在mysql_query($sql_query)的上方還是下方?
cheche905提到:
$sql_query.="cName2
='".$_POST["cName2"].",";
變成
<pre class="c" name="code">
$sql_query.="`cName2`='".mysql_real_escape_string($_POST["cName2"]).",";
如果你要用的話...
另外,看到你的錯誤訊息...我怕你連哪一個部分是php程式,哪一個部分是字串,字串哪一個部分會組出sql都還不太清楚的樣子?
有空的話多熟悉一下這個程式語言,官方參考文件可能比較難讀,不過是最權威的參考:
http://php.net/manual/en/langref.php
http://php.net/manual/zh/langref.php
也了解一下mysql的sql語法:
http://dev.mysql.com/doc/refman/5.1/en/sql-syntax.html
結果一檢查就發現你組的sql這一行少了一個單引號,要改成:
<pre class="c" name="code">
$sql_query.="`cName2`='".mysql_real_escape_string($_POST["cName2"])."',";
另外,建議你用編輯器的功能來貼程式碼,做過highlight以後,會看得比較清楚
cheche905提到:
$sql_query.="cName2
='".$_POST["cName2"].",";
$sql_query.="cProcess
='".$_POST["cProcess"].",";
$sql_query.="cResult
='".$_POST["cResult"].",";
$sql_query.="cDoctor
='".$_POST["cDoctor"].",";
$sql_query.="cRecomment
='".$_POST["cRecomment"].",";
這四行後面的 "," 都少了個單引號,"'," 這樣才對。
cheche905提到:
$sql_query.="cEnd
='".$_POST["cEnd"].",";
這一行最後則是應該寫 ; 分號,卻寫成逗號 ,。請把 "," 改成 "';" 。
用 copy 大法寫程式也要改一下喔~
一樓的費大說得對,你的程式有嚴重的 SQL injection 安全漏洞。
Web 程式最忌諱把 user 傳過來的變數直接串在 SQL 指令或是檔案引用裡。
另外 PHP 程式問題:
cheche905提到:
if(isset($_POST["action"])&&($_POST["action"]=="yes")){
前面的 isset($_POST["action"]) 是多餘的。
cheche905提到:
$sql_db="SELECT * FROMpharmacy
WHEREcID
=".$_GET["id"];
$result=mysql_query($sql_db);
$row_result=mysql_fetch_assoc($result);
程式後面這三行是多餘的。既沒有顯示出來,前面又用 header('Location: ... 跳到別頁了,這些 code 根本沒有任何用處。
最後提到,這 update SQL 並沒有 where 條件,每次執行就是把整個 pharmacy 資料表的所有資料通通改成一樣的資料,確定這是你要的效果嗎?