2012-06-28 29 views
3

我是PHP新手,但沒有編程。來自ASP [經典]背景。簡而言之,我使用PHP 5.4,在IIS7和SQL Server 2005 Express上使用FastCGI。我瞭解了基礎知識,並花了相當長的時間來研究安全性。如果使用存儲過程,則需要PHP PDO PARAMS?

我正在處理GET和POST輸入數據。我的數據庫連接字符串位於Web根目錄之外的單獨文件中。我正在使用PDO準備的語句[儘管我聽說查詢+報價執行速度更快]與命名的佔位符以及數據庫存儲過程。我試圖理解爲什麼我需要在bindParam函數中使用額外的參數,特別是數據類型選項「PDO :: PARAM_STR,12」[該例中的第二個參數表示數據長度正確嗎?]。

在bindParam中指定數據類型和長度有什麼好處?如果我正在使用已經指定了數據類型和長度的存儲過程,是否需要它?另外,我相信我需要使用類似「PDO :: PARAM_INPUT_OUTPUT」的方法來返回存儲過程中的值。

謝謝!

**編輯**
由於某些原因,如果我使用PDO :: PARAM_STR參數,我的存儲過程似乎不會將數據寫入數據庫。所以我省略了這個論點。這裏是我的代碼:

$sql1 = $conn->prepare("EXEC insert_platts :userAgent, :userIp, 1, :source"); 
$sql1->bindParam(':userAgent', $userAgent); 
$sql1->bindParam(':userIp', $userIp); 
$sql1->bindParam(':source', $source); 
$sql1->execute(); 

此外,而不是,我使用lastInsertId(),而不是從存儲過程返回的標識值:不,不需要

$lastRow = $conn->lastInsertId(); 
print $lastRow; 
+0

Hello ..請問有沒有人有關於此的任何信息?我還注意到,通過使用PDO,可以將[撇號]保存爲這是保存特殊字符到數據庫的正確方法嗎?在我的ASP日子裏,我只是加倍努力' - ' - 謝謝 – user1488064

回答

0

數據類型和數據長度。我使用的是mysql存儲過程,參數從來都不是輸入值,儘管我當然會驗證它們。我想這是因爲額外的安全性和INOUT參數。報價:

從一個存儲過程返回一個INOUT參數,使用按位 或操作員設置PDO :: PARAM_INPUT_OUTPUT

你試過嗎?

$params = array(
      ':userAgent'=>$userAgent, 
      ':userIp' => $userIp, 
      ':source' => $source 
     ); 
$sql1 = $conn->prepare("EXEC insert_platts :userAgent, :userIp, 1, :source"); 
$sql1->execute($params); 

關於特殊字符:您是否使用正確的編碼?我的意思是,在php應用程序和數據庫中使用相同的編碼...有時很難在腳本和數據庫中的其他編碼中使用一種編碼......並且經常會出現類似的問題...