2010-12-18 118 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