作者 主題: 請教資料寫入MS-SQL問題  (閱讀 13397 次)

0 會員 與 1 訪客 正在閱讀本文。

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 於: 2006-11-08 16:41 »
請教學長
我使用PHP語法將Linux下的檔案打開
要將資料塞入MS-SQL
確認連線沒有問題(採用freedts)
但是運用變數則會有
PHP Warning:  mssql_query(): message: The label 'Format' has already been declared. Label names must be unique within a query batch or stored procedure. (severity 15) in /root/insert.php on line 17
PHP Warning:  mssql_query(): message: The label 'Version' has already been declared. Label names must be unique within a query batch or stored procedure. (severity 15) in /root/insert.php on line 17
PHP Warning:  mssql_query(): message: The label 'Type' has already been declared. Label names must be unique within a query batch or stored procedure. (severity 15) in /root/insert.php on line 17
PHP Warning:  mssql_query(): message: The label 'Format' has already been declared. Label names must be unique within a query batch or stored procedure. (severity 15) in /root/insert.php on line 17
PHP Warning:  mssql_query(): message: Unclosed quotation mark before the character string ')'. (severity 15) in /root/insert.php on line 17

這些錯誤
經過查證為$MyData所造成
利用gettype($MyData)查出為String這也沒有問題
可是寫入就會有這樣的錯誤
麻煩請給點提示
PS:Code如下
代碼: [選擇]

<?php
# insert.php
$MyData ="";
$fd fopen &#40;"/tmp/myfile", "r"&#41;;
while &#40;!feof &#40;$fd&#41;&#41;
&#123;
        
$buffer fgets&#40;$fd, 40960&#41;;
        #echo $buffer;&#125;
        
$MyData=$MyData.$buffer;
&
#125;
fclose &#40;$fd&#41;;
$today date&#40;"Y"&#41;.date&#40;"m"&#41;.date&#40;"d"&#41;.date&#40;"H"&#41;.date&#40;"i"&#41;;
$comm mssql_pconnect&#40;'DBServer','sa','123456'&#41;;
mssql_select_db&#40;"SC_EIP"&#41; ;
$str "insert into MsnLog_Tmp &#40;InsertDate,MyData&#41; values &#40;'$today','$MyData'&#41;";
mssql_query&#40;$str&#41; or die&#40;"資料庫新增記錄失敗<br>"&#41;;

?>

:

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #1 於: 2006-11-08 17:56 »
$MyData)
這裡是不是少一個單引號呀?
--
TyroneYeh

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #2 於: 2006-11-09 09:07 »
引述: "TyroneYeh"
$MyData)
這裡是不是少一個單引號呀?


不好意思
實際上是有那個單引號
複製貼上時少貼了...已經修改..

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #3 於: 2006-11-09 10:49 »
引述: "andyj"
引述: "TyroneYeh"
$MyData)
這裡是不是少一個單引號呀?


不好意思
實際上是有那個單引號
複製貼上時少貼了...已經修改..


利用
  $MyData=explode("\n",$MyData);
  $MyData=implode("",$MyData);
修正後
只剩下一個錯誤了
PHP Warning:  mssql_query(): message: Line 1: Incorrect syntax near 's'. (severity 15) in /root/insert.php on line 18
PHP Warning:  mssql_query(): Query failed in /root/insert.php on line 18

不過這個真的不太好理解為什麼發生

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #4 於: 2006-11-09 11:03 »
可以先 echo "$str<hr>"; 看一下 insert into 的語法是什麼嗎?
另外 MsnLog_Tmp 的 Schema ?

有用過 tsql 先試一下嗎?
tsql -H DBServer -p 1433  -U sa -P 123456
1> use SC_EIP
2> select * from MsnLog_Tmp
3> go
--
TyroneYeh

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #5 於: 2006-11-09 11:27 »
引述: "TyroneYeh"
可以先 echo "$str<hr>"; 看一下 insert into 的語法是什麼嗎?
另外 MsnLog_Tmp 的 Schema ?

有用過 tsql 先試一下嗎?
tsql -H DBServer -p 1433  -U sa -P 123456
1> use SC_EIP
2> select * from MsnLog_Tmp
3> go


Sir:

1.echo "$str<hr>";  --> 這個<hr>不懂
2.MsnLog_Tmp的格式
   InsertDate varchar 50
  MyData varchar 8000
3.tsql -H DBServer -p 1433  -U sa -P 123456 -->這個測試OK

額外說明
1.如果僅
  $str = "insert into MsnLog_Tmp (InsertDate,MyData) values ('ABC','CDF')";
  mssql_query($str) or die("資料庫新增記錄失敗<br>");
 寫入資料庫測試沒問題,資料確實寫入
2.正式的資料取前100個字元可寫入,所以我猜想會不會是有包含特殊字元('或"或`或...)
  但透過
  htmlentities --- 轉換所有字元成為HTML實體
 htmlspecialchars --- 轉換特殊字元成為HTML實體
 還是一樣的錯誤

麻煩請指教

謝謝

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #6 於: 2006-11-09 12:51 »
代碼: [選擇]

$str = ereg_replace("'", "''", $str);

先執行過這行再 query 呢?
--
TyroneYeh

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #7 於: 2006-11-09 13:05 »
引述: "TyroneYeh"
代碼: [選擇]

$str = ereg_replace("'", "''", $str);

先執行過這行再 query 呢?


Yes!可以了
我大概懂學長的意思了...
下面是我想的:
代表字串內有一個單引號,但對資料庫來說是格式不符
所以用兩個單引號把它變成"沒有"
可是這樣會有缺陷吧!就是單引號會變成不見...
假設我的資料是'data'轉換後會變成''data''
最後在資料庫會只有data

不知道這樣想對不對

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #8 於: 2006-11-09 13:20 »
在SQL裡面,單引號是成雙成對的,第一個單引號是string的開始第二個就是結束了,在 MSSQL 中如果要用 SQL 語法與單引號,就要把單引號變成兩個單引號寫入才不會誤判 string 已結束

好像有另一種SQL變數的方式帶入就不會有 SQL 單引號的問題,在PHP中就不知道大家都怎麼用的了
--
TyroneYeh

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #9 於: 2006-11-09 13:48 »
引述: "TyroneYeh"
在SQL裡面,單引號是成雙成對的,第一個單引號是string的開始第二個就是結束了,在 MSSQL 中如果要用 SQL 語法與單引號,就要把單引號變成兩個單引號寫入才不會誤判 string 已結束

好像有另一種SQL變數的方式帶入就不會有 SQL 單引號的問題,在PHP中就不知道大家都怎麼用的了


謝謝學長花時間指導小弟
讓小弟對這部分的認識又多了許多

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #10 於: 2006-11-09 17:32 »
引述: "TyroneYeh"
代碼: [選擇]

$str = ereg_replace("'", "''", $str);

先執行過這行再 query 呢?


 $str = "insert into MsnLog_Tmp (InsertDate,MyData) values (' ABC\' ',' CDF\' ')";

這樣可以寫入嗎???
如果可以 $str = ereg_replace(" ' ", " \' ", $str);應該也可以
---mssql 不熟  :oops:

風車轉阿轉

  • 憂鬱的高中生
  • ***
  • 文章數: 127
    • 檢視個人資料
請教資料寫入MS-SQL問題
« 回覆 #11 於: 2006-11-09 22:13 »
引述: "micmic3"
引述: "TyroneYeh"
代碼: [選擇]

$str = ereg_replace("'", "''", $str);

先執行過這行再 query 呢?


 $str = "insert into MsnLog_Tmp (InsertDate,MyData) values (' ABC\' ',' CDF\' ')";

這樣可以寫入嗎???
如果可以 $str = ereg_replace(" ' ", " \' ", $str);應該也可以
---mssql 不熟  :oops:


這跟 MS SQL 沒關係
echo $str 出來的東西才會是跟 MS SQL 有關系的

elle1005

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
回覆: 請教資料寫入MS-SQL問題
« 回覆 #12 於: 2007-12-04 14:53 »
我最近也碰到這樣的問題,但是我有二台linux server,一台php是5.0.3 ,一台是5.1.2,同樣一支有做insert into 的程式,在5.0.3 就會出現資料有寫入資料庫但是
mssql_query($str) or die("資料庫新增記錄失敗<br>");  網頁會跑出資料庫新增記錄失敗,而php 版本為5.1.2 則一切正常,因此,我認為可能是php 版本的問題。