PHP - ошибка при вставке даты в MySQL - PullRequest
1 голос
/ 06 мая 2010

У меня типичная проблема при попытке вставить дату в MySQL.

Столбец, определенный в MySQL, имеет тип DATE. Моя версия PHP 5.3.0

Помимо этой проблемы с датой, остальная часть моего кода работает просто отлично.

И это мой PHP-скрипт для этого:

$tablename = BOOKS_TABLE;
    $insert = mysql_query("INSERT INTO $tablename (barcode, book_name, volume_num,".
    " author, publisher, item_type, buy_price, buy_date) VALUES ".
    "(".
        "'" . $barcode      . "', ".
        "'" . $bookname     . "', ".
        "'" . $volumenum    . "', ".
        "'" . $author       . "', ".
        "'" . $publisher    . "', ".
        "'" . $itemtype     . "', ".
        "'" . $buyprice     . "', ".
        "'" . getMySQLDateString($buydate). "'".
        //"'STR_TO_DATE('".$buydate ."', '%d/%m/%Y'))'". //nothing changes in MySQL
    ")");

А это неисправная функция:

function getMySQLDateString($buydate) //typical buydate : 04/21/2009
{
    $mysqlDateString = date('Y-m-d H:i:s', $strtotime($buydate)); 

    return $mysqlDateString;
}

Первая закомментированная строка ничего не сделает, скрипт выполняется без ошибок, однако после этого ничего не изменилось в базе данных.

Текущий подход вызовет фатальную ошибку, сказав, что имя функции должно быть строкой в ​​этой строке.

На самом деле я следил за этим потоком на SO , но просто не могу передать дату в MySQL ...

Может кто-нибудь помочь мне понять, какая часть не так?

Как бы вы сделали это, в этом случае, чтобы сделать это правильно?

Извините за такой вопрос, как подмастерье, заранее большое спасибо.

Обновлен:

Спасибо, что напомнили мне об этом, и вот точное сообщение об ошибке в виде вывода html:

Неустранимая ошибка: имя функции должно быть строкой в ​​C: \ xampp \ htdocs \ comic \ app \ insertBookIntoDB.php в строке 85

указатель на линию начинается с

$mysqlDateString = date('Y-m-d H:i:s', $strtotime($buydate));

Ответы [ 4 ]

2 голосов
/ 06 мая 2010

В следующей строке:

$mysqlDateString = date('Y-m-d H:i:s', $strtotime($buydate)); 

Должно ли это быть:

$mysqlDateString = date('Y-m-d H:i:s', strtotime($buydate)); 

(например, удалить доллар на функции)?

1 голос
/ 06 мая 2010

Это должен быть комментарий, но ради форматирования кода.

Несмотря на необычное форматирование, ваш код ничего вам не поможет.
Чтобы сделать его намного более полезным, вы должны добавить в него некоторые функции отладки.
Разумные имена переменных также помогают
А также удаление вызова функции из строки здания

$sqldate = getMySQLDateString($buydate);
$sqldate = mysql_real_escape_string($sqldate);
//we name this variable $sql because it contains an SQL query
$sql = "INSERT INTO $tablename (barcode, book_name, volume_num,
        author, publisher, item_type, buy_price, buy_date) VALUES 
        (
        '$barcode',
        '$bookname',
        '$volumenum',
        '$author',
        '$publisher',
        '$itemtype',
        '$buyprice',
        '$sqldate'
        )";
//we name this variable $res because it's a resource 
//type variable contains query result
$res = mysql_query($sql) or trigger_error(mysql_error().htmlspecialchars($sql));

после выполнения этот код сообщит вам исчерпывающую информацию об ошибке, если она произошла.

1 голос
/ 06 мая 2010

Не уверен, что это является причиной вашей проблемы, но вы, кажется, пропустили закрытие здесь:

 "'" . getMySQLDateString($buydate).

должно быть

 "'" . getMySQLDateString($buydate)."'"
0 голосов
/ 06 мая 2010

На мой взгляд, хранение дат с использованием явных форматов дат раздражает, и все преобразования строк меня раздражают. Я бы рекомендовал использовать BIGINT для поля даты и сохранить значение времени эпохи в базе данных.

Вы можете получить время эпохи с PHP:

time();

Или, с большей точностью:

microtime();

Плюс, вы можете легко ими манипулировать. Чтобы изменить дату на следующий день:

$myTime + 86400;

Этот формат времени эпохи очень прост для хранения и использования, и он не содержит ошибок со всей ерундой преобразования строк. Чтобы получить аккуратную строку из значения:

date("FORMAT STRING", $myTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...