2011-10-05 42 views
0

我想實現一個快捷功能,以取代常用的mysqli_real_escape_string()作爲跟隨在單獨的腳本將被納入到我的主腳本:實現一個快捷功能,以取代mysqli_real_escape_string()

$cxn = mysqli_connect($hostname, $username, $password, $databasename) 
    or die ("Couldn't connect to server."); 

function m($str) {return "'".mysqli_real_escape_string($cxn, $str)."'";} 

主腳本包含foreach其將循環通過陣列如下:

foreach($ARRAY as $field => $value) 
{ 
    $fields[] = $field; 
    $value = strip_tags(trim($value)); 
    $values[] = m($value); // function m() is implemented here 
} 

在檢查SQL語句,我發現所有插入的值都是空的。我知道如果沒有連接打開,mysqli_real_escape_string()將返回一個空字符串,所以這可能是問題。但是,如果我替換下面的行

$values[] = m($value); 

與此,

$values[] = "'".mysqli_real_escape_string($cxn, $value)."'"; 

返回所有正確的價值觀。那麼,導致我的快捷功能m()失敗的原因是什麼?

+0

由於範圍而失敗 - 函數m()不能訪問全局變量'$ cxn' - 您必須從全局範圍引用它$ GLBOALS ['cxn' ]'或者把它作爲一個論點來傳遞......個人來說,我將整個事物封裝在一個對象的頭腦中。 – CD001

+0

你有沒有嘗試過array_walk_recursive()http://php.net/manual/en/function.array-walk-recursive.php? – Arda

+0

我最近才意識到像array_walk和array_map這樣的函數,並沒有詳細地研究它們。我明白你在做什麼,我會努力在後期改進我的代碼。謝謝:) –

回答

2
$cxn = mysqli_connect(); 
function e($string) 
{ 
    global $cxn; 
    return mysqli_real_escape_string($string, $cxn); 
} 
+1

'$ GLOBALS ['cxn']'會更好 – CD001

+0

我明白了......非常感謝:) –

1

原因就像變量一樣簡單。

所以,如果這個函數要成爲一個類的成員,只需要將$cxn改爲$this->cxn;
否則這個函數根本沒有意義:同意使用佔位符比手動調用轉義函數更好。

另外,我很好奇,你爲什麼不做一些$字段呢?

+0

我沒有爲我的PHP腳本使用OOP。你使用佔位符是什麼意思?字段不是用戶輸入,所以我認爲沒有必要轉義。任何安全問題? –

+0

總是存在安全問題。即使你*認爲*不存在 –

+0

你能引用我一個例子嗎?我有興趣知道更多:) –