我有一個自定義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
。是對的嗎?如果是的話,最乾淨的方法是什麼?謝謝。
而不是隻是將查詢字符串放入'query()',試着先將它保存到一個變量中。然後你可以回顯查詢字符串,看看你是否得到你所期望的。 –
什麼是不工作? mysql_error()輸出什麼?您是否嘗試過在tildas中包裝表名變量,例如'$ userTable' – Dave
我認爲Dave的意思是反引號('')而不是tildas(〜) –