#php #mysql #web #pdo
#php #mysql #веб #pdo
Вопрос:
Я бился головой об этот код вставки PHP в течение последнего дня или около того. Кажется, я не могу найти проблему, и она сохраняется после 2 полных переделок кода. Проблема довольно проста, она ничего не вставит, и я сократил возможности, просто введя значения для переменных напрямую, а не используя GET для получения их из HTML через JS. Может быть, кто-то здесь может определить, что происходит. Я знаю, что PDO определенно работает, потому что я могу получить информацию из таблицы mysql.
<?php
$tbl = 'transactions';
$acc = 'blah1';
$date = '2014-07-01';
$cp = 'counterparty';
$ctg = 'category';
$dbt = 1.00;
$crd = 0.00;
$user = "root";
$pass = #######; // Note: the password is actually in the file on my side.
try {
$con = new PDO("mysql:host=localhost;dbname=budget;charset=utf8",$user,$pass);
$con -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
$sql = $con -> prepare("INSERT INTO transactions VALUES (:account, :date, :counterparty, :category, :debit, :credit)");
$sql -> bindValue(':account', $acc, PDO::PARAM_STR);
$sql -> bindValue(':date', $date, PDO::PARAM_STR);
$sql -> bindValue(':counterparty', $cp, PDO::PARAM_STR);
$sql -> bindValue(':category', $ctg, PDO::PARAM_STR);
$sql -> bindValue(':debit', strval($dbt), PDO::PARAM_STR);
$sql -> bindValue(':credit', strval($crd), PDO::PARAM_STR);
$sql -> execute();
$dbh = NULL;
?>
Любая помощь будет оценена. Спасибо.
Комментарии:
1. Хорошо… выглядит хорошо. Без дополнительной информации я думаю, что это трудно отлаживать больше…
2. покажите определение таблицы… если имена полей не заданы, вы должны использовать правильный порядок и поля для работы запроса. также проверьте возвращенную ошибку выполнения. (кстати .. обычная практика — не иметь пробелов до / после
->
3. Попробуйте обернуть ваши значения bindValue и выполнить также в блоке try / catch и посмотреть, не появятся ли у вас какие-либо ошибки.
4. Вы пробовали добавлять имена полей, которые вы вставляете после
INSERT INTO transactions
, напримерINSERT INTO transactions (account, date...) VALUES ...
?5. @Samsquanch Если бы было исключение, он бы очень хорошо знал об этом даже без
try..catch
. На самом деле, он должен избавиться отtry..catch
блока, который у него есть.
Ответ №1:
Я ответил на это в комментариях к своему сообщению, но я собираюсь опубликовать его в качестве ответа, чтобы он был более заметным:
Что ж, теперь код работает, я добавил это в JS: xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 amp;amp; xmlhttp.status==200) {}} в попытке увидеть, что происходит с блоками try-catch, и внезапнокод начал работать. Я не уверен, что понимаю, почему это внезапно устранило проблему? Не мог бы кто-нибудь объяснить.
Ответ №2:
Вместо этого:
$sql = $con -> подготовить («ВСТАВИТЬ В ЗНАЧЕНИЯ транзакций (: счет, : дата,: контрагент,: категория,: дебет,: кредит)»);
Попробуйте этот способ:
$sql = $con -> подготовить («ВСТАВИТЬ В транзакции (СЧЕТ, ДАТУ, КОНТРАГЕНТА, КАТЕГОРИЮ, ДЕБЕТ, КРЕДИТ) ЗНАЧЕНИЯ (:счет, : дата,: контрагент,: категория,: дебет,: кредит)»);
Что нужно проверить:
1) Проверьте определение таблицы на наличие точных имен полей.
2) Проверьте типы данных, объявленные в таблице. (В вашем коде вы пытались вставить строку во все поля)
3) Используйте блок Try, Catch
try
{
// Your code
}
catch (PDOException $pe)
{
$con->rollBack();
die($pe->getMessage());
}