iT邦幫忙

0

PHP的UPDATE無法更新?

php
cheche905 4 年前4382 瀏覽

不好意思,我的語法是這樣,都已經是照抄原本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);
?>

海綿寶寶 iT邦超人 1 級 ‧ 4 年前 檢舉
這列多了最後面的逗號
$sql_query.="`cEnd`='".$_POST["cEnd"].",";


建議你加列
$sql_query.="`cEnd`='".$_POST["cEnd"].",";
echo "sqlstr=".$sql_query;
mysql_query($sql_query);


把最後組成的sql字串顯示出來看
會比較容易看出問題所在
cheche905 iT邦新手 5 級 ‧ 4 年前 檢舉
請問加了echo這一段後,要去那裡看,因為我加了之後沒有顯示。不好意思,我剛學沒幾天。

2 個回答

4
fillano
iT邦超人 1 級 ‧ 4 年前
最佳解答

你把sql字串印出來貼到mysql client或是phpmyadmin跑跑看就知道問題出在哪裡。

另外,你這樣組sql,會有sql injection的問題,至少要用mysql_real_escape處理一下再丟給sql。(等到php熟一點,可以考慮先使用pdo,利用它的prepared statement來減少sql injection的可能性。當然還有其他framework可以使用就是了,就看你的偏好囉。)

看更多先前的回應...收起先前的回應...
fillano iT邦超人 1 級 ‧ 4 年前 檢舉

記錯函數名字而且前面講的不夠清楚,總之可以用mysql_real_escape_string($_POST['XXX'])處理過再丟進sql string。

cheche905 iT邦新手 5 級 ‧ 4 年前 檢舉

不好意思,跑出來的錯誤是這樣

#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)的上方還是下方?

fillano iT邦超人 1 級 ‧ 4 年前 檢舉

cheche905提到:
$sql_query.="cName2='".$_POST["cName2"].",";

變成

&lt;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

fillano iT邦超人 1 級 ‧ 4 年前 檢舉

結果一檢查就發現你組的sql這一行少了一個單引號Orz,要改成:

&lt;pre class="c" name="code">
$sql_query.="`cName2`='".mysql_real_escape_string($_POST["cName2"])."',";
fillano iT邦超人 1 級 ‧ 4 年前 檢舉

另外,建議你用編輯器的功能來貼程式碼,做過highlight以後,會看得比較清楚

4
wiseguy
iT邦超人 1 級 ‧ 4 年前

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 * FROM pharmacy WHERE cID=".$_GET["id"];
$result=mysql_query($sql_db);
$row_result=mysql_fetch_assoc($result);

程式後面這三行是多餘的。既沒有顯示出來,前面又用 header('Location: ... 跳到別頁了,這些 code 根本沒有任何用處。暈

最後提到,這 update SQL 並沒有 where 條件,每次執行就是把整個 pharmacy 資料表的所有資料通通改成一樣的資料,確定這是你要的效果嗎?汗

cheche905 iT邦新手 5 級 ‧ 4 年前 檢舉


目前改成這樣了還是更新失敗。

cheche905 iT邦新手 5 級 ‧ 4 年前 檢舉

謝謝,我已經找到問題了!的確是我的單引號使用方式不對,感謝大家幫忙初學者的我。

我要發表回答

立即登入回答