MySQL подготовил заявления, это возможно? - PullRequest
0 голосов
/ 18 декабря 2010
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;
    }

можно ли использовать заполнители для имен таблиц или это возможно только для столбцов таблицы?

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Нет, он принимает только значения (то есть: не столбцы, имена таблиц, имена схем и зарезервированные слова), так как они будут экранированы.Вы можете сделать это, хотя:

$sql = sprintf('SELECT * FROM %s WHERE %s = ?', $tableName, $idName);
$stmt = mysqli_prepare($connection, $sql); 
mysqli_stmt_bind_param($stmt,'i',$id);
1 голос
/ 18 декабря 2010

Нет, вы не можете.Имена таблиц и столбцов - синтаксис, значения - данные.Синтаксис не может быть параметризован.

Имя таблицы / столбца может быть безопасно вставлено непосредственно в строку, поскольку оно происходит из проверенного ограниченного набора допустимых имен таблиц / столбцов ( верно? ),Параметрами должны быть только пользовательские значения.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...