2010-12-18 162 views
0
function fetchbyId($tableName,$idName,$id){ 
     global $connection; 
     $stmt = mysqli_prepare($connection, 'SELECT * FROM ? WHERE ? = ?'); 
     var_dump($stmt); 
     mysqli_stmt_bind_param($stmt,'s',$tableName); 
     mysqli_stmt_bind_param($stmt,'s',$idName); 
     mysqli_stmt_bind_param($stmt,'i',$id); 
     $stmt = mysqli_stmt_execute($stmt); 
     mysqli_stmt_bind_result($name,$id); 
     $fetchArray = array(); 
     while($row = mysqli_stmt_fetch($stmt)){ 
      $fetchArray[] = $row; 
     } 
     return $fetchArray; 
    } 

我可以使用表名的地方持有人嗎?或者這是唯一可能的表列?mysql準備的語句,這可能嗎?

+0

這是不可能的列。這是你正在嘗試構建的無用功能。它可以幫你避免輸入3個單詞,但會使你的代碼變得不可讀。 – 2010-12-18 17:59:29

+0

使它成爲像這樣運行的一個通用函數''data = getRow(「SELECT * FROM table WHERE id =?」,$ id);' – 2010-12-18 18:05:33

+0

@Col。 Shrapnel:不幸的是,這個解決方案(getRow)剝奪了他對數據庫的抽象。切換到XML或對象存儲將是一個痛苦... – netcoder 2010-12-18 18:09:40

回答

1

不,它只接受值(即:不是列,表名,模式名和保留字),因爲它們將被轉義。你可以這樣做:

$sql = sprintf('SELECT * FROM %s WHERE %s = ?', $tableName, $idName); 
$stmt = mysqli_prepare($connection, $sql); 
mysqli_stmt_bind_param($stmt,'i',$id); 
1

不,你不能。表和列名稱是語法,值是數據。語法不能被參數化。

表/列名可以直接安全地插入到字符串中,因爲它們來自經過驗證的有限表/列名稱集合(正確?)。只有用戶提供的值應該是參數。

function fetchbyId($tableName,$idName,$id){ 
    global $connection; 
    $stmt = mysqli_prepare($connection, "SELECT * FROM $tableName WHERE $idName = ?"); 
    mysqli_stmt_bind_param($stmt,'i',$id); 
    $stmt = mysqli_stmt_execute($stmt); 
    mysqli_stmt_bind_result($name,$id); 
    $fetchArray = array(); 
    while($row = mysqli_stmt_fetch($stmt)){ 
     $fetchArray[] = $row; 
    } 
    return $fetchArray; 
} 
+0

「只有用戶提供的值應該是參數」 - 你不會錯的更多,夥計 – 2010-12-18 18:02:54

+0

@ Col.Shrapnel:與「來自受控環境的值」相反。請注意,我沒有說*「不是用戶提供的值不能是參數」*。但是,也許你向我解釋了爲什麼我不能更加錯誤,什麼是合理的倒退。 – Tomalak 2010-12-18 18:04:59

+0

「受控環境」中也有撇號和空值。準備好的陳述**是**旨在讓開發者**不**考慮數據來源。去圖 – 2010-12-18 18:07:15