Я получаю очень разочаровывающие результаты при попытке связать параметры с подготовленным оператором PDO.
В результате получается следующая ошибка: В синтаксисе SQL имеется ошибка;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' items '' в строке 1
Ошибка ясно показывает, что таблица 'items' заключена в одинарные кавычкикогда это не должно быть.Я собрал небольшой тест ниже.Как вы можете видеть, я не помещаю параметры в кавычки в утверждении для начала, что, вероятно, было бы первоначальным предположением большинства людей.Я знаю, что это как-то связано с функцией BindParam / BindValue (я пробовал оба с одинаковыми результатами), потому что если вы обойдете функцию bindParams, установив $ params в null и заменив ': table' на 'items' в выражении,отлично работает.
<code><?php
echo 'started test...';
//connect to database
try {
$dbHandle = new PDO('mysql:dbname=mydatabase;host=mysql.mywebsite.com', 'myuser', 'mypass');
} catch (PDOException $e) {
echo 'Database connection failed: ' . $e->getMessage();
}
//print out the contents of table 'items'
print_r(query("SELECT * FROM :table", array("table" => "items"), $dbHandle));
//the query() function used above
function query($query_str, $params = null, $dbHandle) {
$stmt_obj = $dbHandle->prepare($query_str);
if($params != null) {
bindParams($stmt_obj, $params);
}
$stmt_obj->execute();
//debug stuff
echo '<pre>';
echo 'ERROR: ';
$error = $stmt_obj->errorInfo();
echo $error[2].'<br /><br />';
echo 'DEBUG DUMP:<br />';
$stmt_obj->debugDumpParams();
echo '
';if (preg_match ("/ SELECT / i", $ query_str)) {$ result = array ();while ($ row = $ stmt_obj-> fetch (PDO :: FETCH_ASSOC)) {array_push ($ result, $ row);} unset ($ stmt_obj);вернуть $ результат;}} функция bindParams ($ stmt, $ params) {if (is_object ($ stmt) && ($ stmt instanceof PDOStatement)) {foreach ($ params as $ key => $ value) {if (is_int ($ value)) {$ param = PDO :: PARAM_INT;} elseif (is_bool ($ value)) {$ param = PDO :: PARAM_BOOL;} elseif (is_null ($ value)) {$ param = PDO :: PARAM_NULL;} elseif (is_string ($ value)) {$ param = PDO :: PARAM_STR;} else {$ param = FALSE;} if ($ param) {$ stmt-> bindValue (": $ key", $ value, $ param);}}}
Кто-нибудь хочет избавить меня от моих страданий и указать на что-то действительно очевидное, что я скучаю?