использование подготовленных операторов mysqli для привязки параметров к разделу SELECT запроса - PullRequest
2 голосов
/ 26 января 2010

Я создаю веб-приложение, которое импортирует данные из каналов данных в php / mysql. Я импортирую данные в буфер / таблицу временного хранения. Поскольку каждый формат данных отличается, я выбираю столбец для выбора в зависимости от конкретного источника.

У меня проблемы с настройкой этого запроса для работы в этом контексте:

$stmt = $this->dbObj->prepare("SELECT mk.PK_phone_maker, b.?, b.phoneDescription
            b.thumbPic,
        FROM buffer_table b left join mobile_phone pm on b.? = pm.phoneModel
            LEFT JOIN phone_maker mk on mk.CompanyName = b.?
        WHERE pm.phoneModel is null
        group by b.?");
$stmt->bind_param('ssss',$phoneModelField, $phoneModelField, $phnMakerField,$phoneModelField);
$stmt->execute();

Я получаю сообщение об ошибке:

Fatal error: Call to a member function bind_param() on a non-object

Это относится к строке:

 $stmt->bind_param('ssss',$phoneModelField, $phoneModelField, 

И я предполагаю, что это потому, что "prepare" на моем sql не работал, так как $ stmt не является объектом

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

Ответы [ 2 ]

1 голос
/ 26 января 2010

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

0 голосов
/ 27 января 2010

@ Виктор Николлет прав: вы можете использовать параметр запроса только в контексте, в котором вы могли бы использовать буквальное значение .

Если вам нужно сделать другие части переменной запроса (например, имя столбца, имя таблицы, ключевые слова SQL или целые выражения SQL), вам нужно построить динамический запрос SQL в виде строки и интерполировать переменные или выражения PHP в строка. Обязательно сделайте это осторожно, чтобы избежать уязвимостей SQL-инъекций.

Другой WTF в вашем коде состоит в том, что вы не проверяли, чтобы функция prepare() возвращала объект типа mysqli_stmt. В этом случае, поскольку вы использовали параметры запроса недопустимым образом, prepare() вернул false , чтобы указать синтаксическую ошибку. Конечно, false не является объектом; у него нет bind_param() метода. Вот почему вы получили ошибку, которую сделали.

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