2013-11-26 31 views
0

我有一個自定義query()功能防止PHP變量如下所示:MySQL查詢功能似乎從表中使用名稱

$link = mysqli_connect("localhost","username","password"); 
mysqli_select_db($link, "database_table"); 

//executes a given sql query with the params and returns an array as result 
function query() { 
global $link; 
$debug = false; 

//get the sql query 
$args = func_get_args(); 
$sql = array_shift($args); 

//secure the input 
for ($i=0;$i<count($args);$i++) { 
    $args[$i] = urldecode($args[$i]); 
    $args[$i] = mysqli_real_escape_string($link, $args[$i]); 
} 

//build the final query 
$sql = vsprintf($sql, $args); 

if ($debug) print $sql; 

//execute and fetch the results 
$result = mysqli_query($link, $sql); 
if (mysqli_errno($link)==0 && $result) { 

     $rows = array(); 

     if ($result!==true) 
     while ($d = mysqli_fetch_assoc($result)) { 
      array_push($rows,$d); 
     } 

     //return json 
     return array('result'=>$rows); 

} else { 

    //error 
     return array('error'=>'Database error'); 
} 
} 

我然後使用該函數以下列方式:

//check if username exists 
$login = query("SELECT username FROM $userTable WHERE username='%s' limit 1", $user); 
if (count($login['result'])>0) { 
    errorJson('Username already exists'); 
} 

//try to register the user 
$result = query("INSERT INTO $userTable(username, password) VALUES('%s','%s')", $user, $pass); 
if (!$result['error']) { 
//success 
loginAfterRegistering($user, $pass); 
} else { 
//error 
errorJson('Registration failed'); 
} 

傳遞給上述活動的函數的變量是:

$pass=$_GET['password'] $user=$_GET[username] $userTable="myTable_name";

引起問題的唯一變量是$userTable="myTable_name";如果我直接把名字變成這樣的query()功能:

$result = query("INSERT INTO myTable_name(username, password) VALUES('%s','%s')", $user, $pass); 

那就沒有問題。但我需要能夠將其作爲一個PHP變量出於其他原因。我試過".$userTable.""$userTable"以及僅舉幾例。我的猜測是我需要調整query()函數以包含變量,因爲我已經完成了$pass$user。是對的嗎?如果是的話,最乾淨的方法是什麼?謝謝。

+1

而不是隻是將查詢字符串放入'query()',試着先將它保存到一個變量中。然後你可以回顯查詢字符串,看看你是否得到你所期望的。 –

+0

什麼是不工作? mysql_error()輸出什麼?您是否嘗試過在tildas中包裝表名變量,例如'$ userTable' – Dave

+0

我認爲Dave的意思是反引號('')而不是tildas(〜) –

回答

0

好的,所以我知道有一個簡單的解決方案。我發現問題與變量定義的位置有關。我必須在函數中移動變量定義。然後變量被拿起並且現在正常運行。

此查詢語法結束了工作了:

$login = query("SELECT username FROM $userTable WHERE username='%s' limit 1", $user);

感謝那些誰評論的一切協助。