Как я могу связать PDO bindValue/bindParam с MySQL?

Я использовал MySQL и mysqli в прошлом, но начал новый проект, поэтому хотел вернуться к OOP с PDO-mysql .. однако он не хочет работать:

$dbh = new PDO('mysql:host='.$host.';dbname='.$database, $username, $password);
if(isset($_POST["name"]) && isset($_POST["password"]))
    {

        $pwdHasher = new PasswordHash(8, FALSE);
        $hash = $pwdHasher->HashPassword($_POST["password"]);
        //$insert = $dbh->prepare('insert into users (username,password) values ("?","?")');
        $insert = $pdo->prepare("insert into users (username,password) values (?,?)");      
        $insert->bindParam(1,$_POST["name"]);
        $insert->bindParam(2,$hash);
        $insert->execute();
        echo "Registration Success!";
    }

edit: приведенный выше код работает, если я сменю код из прокомментированной строки на некомментированный (т. е. одинарная кавычка для двойных кавычек). Однако это не работает позже:

$query = $pdo->prepare("select * from users where username = ?");
$query->bindParam(1,$_POST["name"]);
$result = $query->execute()
1
nl ja de
Извините, я должен уточнить, что в одном проекте я могу выбрать mysqli или PDO, в другом проекте я могу использовать только PDO или mysql. Поскольку MySQL устарел, я склоняюсь к использованию PDO, поэтому мне нужно запомнить только один способ сделать что-то. edit: Почему downvote?
добавлено автор Asitaka, источник

3 ответы

Хорошо, вы нашли ответ на свой первый вопрос.
Для второго это было бы

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

называется сразу после подключения.
он скажет вам, что не так с вашим запросом.

error_reporting(E_ALL); 

также всегда помогает с такими ошибками, как ошибки с ошибками (например, $ pdo не $ dbh)

1
добавлено
подлый! Согласитесь, всегда устанавливая ERRMODE_EXCEPTION, если вы отправляете его непосредственно на экземпляр класса, вы также получите исключения, если сбой подключения к базе данных.
добавлено автор hank, источник
Ваше общее чувство. Я изменил $ pdo-$ dbh также как эксперимент и также получил error_reporting (E_ALL). - ответ на вопрос - двойная цитата или одинарная кавычка при составлении инструкции.
добавлено автор Asitaka, источник

If you want to use ? for placeholders, you are supposed to send an array to the execute-method matching the positions of the question marks. $insert->execute(array('value1', 'value2'));

You could however use named placeholders .. WHERE x = :myxvalue and use $insert->bindValue(':myxvalue', 'thevalue', PDO::PARAM_STR);

Also, please have a look at the difference between bindParam and bindValue

1
добавлено
Просматривая документацию, я понимаю, что на самом деле можно связать с помощью индекса вопросительных знаков с помощью bindValue. Может быть, вы пропустили определение типа параметра?
добавлено автор hank, источник
Я получаю разницу bindParam и bindValue, но это не объясняет, почему это ничего не заменяет. edit: Я перешел от привязки к названным заполнителям привязки к индексам в качестве эксперимента, когда первый не работал.
добавлено автор Asitaka, источник

Ответ на этот вопрос прост и смущен:  Мне нужно изменить одинарные кавычки, в которых заключен оператор sql, готовый к двойным кавычкам (и удалять двойные кавычки, где находится знак «?». изменение:

$insert = $dbh->prepare('insert inв users (username,password) values ("?","?")');

в

$insert = $dbh->prepare("insert inв users (username,password) values (?,?)");

и все работает.

1
добавлено
Он будет работать так же хорошо, как одинарные кавычки, если вы не цитируете вопросительные знаки. используя bindValue и сообщив PDO, какой параметр это обеспечивает правильную обработку.
добавлено автор hank, источник
Хэнк, ты прав, это двойные кавычки внутри, которые вызывают проблемы. Спасибо за помощь! - также я обязательно укажу тип, чтобы не было шансов на дополнительные ошибки из-за типов
добавлено автор Asitaka, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp