Param в подготовленном выражении содержит дефис (-)?

Я пытаюсь переписать все мои стандартные запросы MySQLi в подготовленные операторы MySQLi.

Однако я заметил проблему: всякий раз, когда у меня есть переменная, содержащая дефис, выполнение () завершается ошибкой.

Переменные, с которыми я имею дело ($project_id), выглядят так: «AAD0012003-01».

$get_progress_done = $db->prepare("SELECT COUNT(*) as rows FROM testvoorstage_checklists.?");
        $get_progress_done->bind_param("s", $project_id);
        $get_progress_done->execute();
        $get_progress_done->store_result();
        $get_progress_done->bind_result($rows);

        while($get_progress_done->fetch()) {            
            echo $rows;
        }

Я искал решение уже пару дней, и я до сих пор не нашел способ «убежать» от дефиса в переменной.

Я знаю, что запросы работают, потому что я пробовал их в PHPMyAdmin с установленной переменной, и там они работают нормально.

Я изучаю подготовленные операторы, и я хотел бы знать, как это исправить, потому что у меня довольно много переменных, содержащих специальные символы.

Ошибка, которую я получаю:

Вызов функции-члена bind_param() для не-объекта


person Kevin Sleegers    schedule 26.11.2013    source источник
comment
1. Проверить ошибки 2. Вы можете привязывать только значения, но не имена объектов базы данных   -  person zerkms    schedule 26.11.2013
comment
возможный дубликат Могу ли я параметризовать имя таблицы в подготовленном заявление?   -  person Álvaro González    schedule 26.11.2013
comment
Спасибо за ваши ответы. Ну ладно, я уже так подумал. Однако во всех других утверждениях, где я использую одну и ту же переменную для получения определенной строки из таблицы, она также терпит неудачу. Есть ли способ избежать переменной? Потому что, когда я пытаюсь выполнить запрос в PHPMyAdmin и вставляю AAD0012003-01 (с обратными кавычками) непосредственно в запрос, он работает нормально. '-', кажется, единственная проблема.   -  person Kevin Sleegers    schedule 26.11.2013


Ответы (1)


  1. Ваша проблема не имеет ничего общего с дефисами или подготовленными утверждениями.
  2. Настоящая проблема заключается в вашем дизайне базы данных. Вместо того, чтобы иметь отдельную таблицу для каждого проекта, вы должны хранить все проекты в одной таблице.
  3. Пожалуйста, называйте свои переменные разумно. То, что возвращает $db->prepare, никоим образом не является чем-то вроде $get_progress_done — это просто оператор mysqli.

Итак, этот код будет делать

$sql  = "SELECT COUNT(*) as rows FROM projects where project_id = ?";
$stmt = $db->prepare($sql);
$stmt->bind_param("s", $project_id);
$stmt->execute();
$stmt->bind_result($rows);
$stmt->fetch();
echo $rows;

Однако я никогда в жизни не пойму пользователей PHP, которые пишут 7 строк кода, а достаточно одной.

person Your Common Sense    schedule 26.11.2013
comment
Спасибо, я попробую это! :) - person Kevin Sleegers; 26.11.2013
comment
Я думал о своем дизайне базы данных, но понятия не имею, как хранить все проекты в одной таблице. Я определенно не эксперт по базам данных. Нужно ли создавать несколько таблиц для хранения значений из проекта? Например, одна таблица для всех «проектных отделов», другая для «компонентов» и т. д.? А потом создать одну таблицу, где я сливаю как бы все данные из других таблиц вместе? - person Kevin Sleegers; 26.11.2013
comment
Лучше задайте другой вопрос. Вокруг тусуется довольно много экспертов по базам данных. - person Your Common Sense; 26.11.2013
comment
Хорошо, спасибо за ваше время. Я приму ваш ответ, потому что это решение моей проблемы, когда я правильно разработаю свой дизайн базы данных. - person Kevin Sleegers; 26.11.2013