Не удается ВСТАВИТЬ в mysql через PDO

#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());
}