Ошибка при попытке добавить переменную в подготовленный оператор Php - PullRequest
0 голосов
/ 09 февраля 2019

Может кто-нибудь показать мне, как исправить этот запрос, который продолжает давать мне ошибку синтаксиса sql?

Неустранимая ошибка: Uncaught mysqli_sql_exception: у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с '?'в строке 1 в C: \ xampp \ htdocs \ test \ browsing_histories.php: 38 Трассировка стека: # 0 C: \ xampp \ htdocs \ test \ browsing_histories.php (38): запрос mysqli-> ('SELECT * FROM b... ') # 1 {main} выбрасывается в C: \ xampp \ htdocs \ test \ browsing_histories.php в строке 38

Мне нужно сделать это так, чтобы мне не нужно было писать сотнизапросов, кроме одного.Сотни запросов, где каждый для каждого столбца запросов.Например,

$total_pages = $conn->query("SELECT * FROM browsing_histories WHERE USERNAME = ? ")->num_rows; 

$total_pages = $conn->query("SELECT * FROM browsing_histories WHERE FIRST_NAME = ? ")->num_rows; 

$total_pages = $conn->query("SELECT * FROM browsing_histories WHERE GENDER = ? ")->num_rows; 

$total_pages = $conn->query("SELECT * FROM browsing_histories WHERE AGE-RANGE = ? ")->num_rows; 

И так далее ...

Один запрос должен делать это так, как мы можем с не подготовленными операторами.Следовательно, сделал это следующим образом:

$stmt = $conn->prepare('SELECT * FROM browsing_histories WHERE $query_type = ? 
ORDER BY id LIMIT ?,?'); 

Полный контекст:

$query_type = $_GET['query_type']; 

//If $_GET['query_type']) is empty then show error as it must be set. 
if(!isset($_GET['query_type']) && empty($_GET['query_type'])) 
{ 
    echo "Invalid Query!"; 
} 
//If $_GET['query_type']) is full with value other than wild-card or "All" 
or "all" then make speccific query. 
elseif($query_type != 'all' OR $query_type != 'All' OR $query_type != '*') 
{ 
    ${$query_type} = $_GET[$_GET['query_type']]; 
    $followed_word = ${$query_type}; //Same as: $_GET[$_GET['query_type']]; 

    $total_pages = $conn->query("SELECT * FROM browsing_histories WHERE 
$query_type = ?")->num_rows; 
    //Make the query. 
    $stmt = $conn->prepare('SELECT * FROM browsing_histories WHERE 
$query_type = ? ORDER BY id LIMIT ?,?'); 
    $stmt->bind_param('sii', $query_type, $calc_page, $num_results_on_page); 
} 
else //Make general query or query for all records. 
{ 
    //Grab "all records" from the table. 
    //Get the total number of records from the table: 
"browsing_histories". 
    $total_pages = $conn->query("SELECT * FROM browsing_histories")- 
>num_rows; 
    //Make the query. 
    $stmt = $conn->prepare('SELECT * FROM browsing_histories ORDER BY id 
LIMIT ?,?'); 
    $stmt->bind_param('ii', $num_results_on_page); 
} 

$stmt->execute(); 

ПРИМЕЧАНИЕ. Даже когда я меняю тип $ query_type в подготовленном запросе оператора на фактическое имя столбца, такое как "username "then я все еще получаю ту же ошибку.

$stmt = $conn->prepare('SELECT * FROM browsing_histories WHERE username = 
? 
ORDER BY id LIMIT ?,?'); 

EDIT 1: исправлен мой код для следования, но не повезло!

$query_type = $_GET['query_type']; 

//If $_GET['query_type']) is empty then show error as it must be set. 
if(!isset($_GET['query_type']) && empty($_GET['query_type'])) 
{ 
    echo "Invalid Query!"; 
} 
//If $_GET['query_type']) is full with value other than wild-card or 
"All" or "all" then make speccific query. 
elseif($query_type != 'all' OR $query_type != 'All' OR $query_type != 
'*') 
{ 
    ${$query_type} = $_GET[$_GET['query_type']]; 
    $followed_word = ${$query_type}; //Same as: 
$_GET[$_GET['query_type']]; 

    $total_pages = $conn->query("SELECT * FROM browsing_histories WHERE 
username = ?")->num_rows; 
    //Make the query. 
    $stmt = $conn->prepare('SELECT * FROM browsing_histories WHERE 
username = ? ORDER BY id LIMIT ?,?'); 
    $stmt->bind_param('sii', $query_type, $calc_page, 
$num_results_on_page); 
} 
else //Make general query or query for all records. 
{ 
    //Grab "all records" from the table. 
    //Get the total number of records from the table: 
"browsing_histories". 
    $total_pages = $conn->query("SELECT * FROM browsing_histories")- 
>num_rows; 
    //Make the query. 
    $stmt = $conn->prepare('SELECT * FROM browsing_histories ORDER BY id 
LIMIT ?,?'); 
    $stmt->bind_param('ii', $calc_page, $num_results_on_page); 
} 

$stmt->execute(); 

EDIT 2: вот мое последнее обновление.Проблема остается.Закомментированные запросы - те, с которыми я экспериментировал.Все они показывают ошибку один и тот же.Некомментированный тоже показывает ошибку.

    $query_type = $_GET['query_type']; 

    //If $_GET['query_type']) is empty then show error as it must be set. 
    if(!isset($_GET['query_type']) && empty($_GET['query_type'])) 
    { 
        echo "Invalid Query!"; 
    } 
    //If $_GET['query_type']) is full with value other than wild-card or 
    "All" or "all" then make speccific query. 
    elseif($query_type != 'all' OR $query_type != 'All' OR $query_type != 
    '*') 
    { 
    ${$query_type} = $_GET[$_GET['query_type']]; 
    $followed_word = ${$query_type}; //Same as: 
    $_GET[$_GET['query_type']]; 

    //$total_pages = $conn->query("SELECT * FROM browsing_histories WHERE 
    ? = ?")->num_rows; 
    //$total_pages = $conn->query("SELECT * FROM browsing_histories WHERE 
    \"$query_type\" = ?")->num_rows; 
    $total_pages = $conn->query("SELECT * FROM browsing_histories WHERE 
    $query_type = ?")->num_rows; 
    $stmt->bind_param('i', ${$query_type}); 
    $stmt->execute(); 
    //Make the query. 
    //$stmt_2 = $conn->prepare("SELECT * FROM browsing_histories WHERE ? 
    = ? ORDER BY id LIMIT ?,?"); 
    //$stmt_2 = $conn->prepare("SELECT * FROM browsing_histories WHERE 
    \"$query_type\" = ? ORDER BY id LIMIT ?,?"); 
    //$stmt_2 = $conn->prepare("SELECT * FROM browsing_histories WHERE 
    $query_type = ? ORDER BY id LIMIT ?,?"); 
    $stmt_2 = $conn->prepare("SELECT * FROM browsing_histories WHERE 
    username = ? ORDER BY id LIMIT ?,?"); 

    //$stmt_2->bind_param('sii', $query_type, ${$query_type}, $calc_page, 
    $num_results_on_page); 
    $stmt_2->bind_param('sii', ${$query_type}, $calc_page, 
    $num_results_on_page); 
    } 
    else //Make general query or query for all records. 
    { 
        //Grab "all records" from the table. 
        //Get the total number of records from the table: 
        "browsing_histories". 
        $total_pages = $conn->query("SELECT * FROM browsing_histories")- 
        >num_rows; 
        //Make the query. 
        $stmt = $conn->prepare('SELECT * FROM browsing_histories ORDER BY 
        id LIMIT ?,?'); 
        $stmt->bind_param('ii', $calc_page, $num_results_on_page); 
        } 

        $stmt->execute(); 

1 Ответ

0 голосов
/ 09 февраля 2019

два параметра нуждаются в двух значениях

$stmt->bind_param('ii', $num_results_on_page, $second_value); 

и для этого 3 параметра 3 значения

$stmt = $conn->prepare('SELECT * FROM browsing_histories WHERE username = ? 
ORDER BY id LIMIT ?,?'); 

$stmt->bind_param('sii',$your_username_value, $num_results_on_page, $second_value); 

и проверка кода для

 $total_pages = $conn->query("SELECT * FROM browsing_histories WHERE username = ?")->num_rows;

кажется без параметратоже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...