【问题标题】:Inserting DATE to MYSQL database.. Posting values from Android to PHP将 DATE 插入 MYSQL 数据库。将值从 Android 发布到 PHP
【发布时间】:2019-07-27 16:49:01
【问题描述】:

我有一个 dd-mm-yyyy 格式的日期值,我想将 DATE 或 DATETIME 值插入 mysql 数据库,但插入始终是 0000-00-00

已经尝试过了,但对我不起作用。

$dateOne = $_POST['dateOne'];
$dateTwo = $_POST['dateTwo'];

$timestamp = date('Y-m-d', strtotime($dateOne));
$ts = date('Y-m-d', strtotime($dateTwo));

PHP部分

$name = $_POST['name'];
$myname= $_POST['myName'];
$dateOne = $_POST['dateOne'];
$dateTwo = $_POST['dateTwo'];

$timestampa = date('Y-m-d', strtotime($dateOne));
$tsa = date('Y-m-d', strtotime($dateTwo));

$sql = "INSERT INTO hires_bp (suraduju_od, suraduju_do,  id_band, id_producer) VALUES ($timestampa, $tsa, (SELECT id FROM band WHERE band_name = '$myname'), (SELECT id FROM producer WHERE producer_name = '$name'))";

Android / Java 部分 - 对于 dateTwo.. dateOne 是一样的

mCurrentDate = java.util.Calendar.getInstance();
int year = mCurrentDate.get(java.util.Calendar.YEAR);
int month = mCurrentDate.get(java.util.Calendar.MONTH);
int day = mCurrentDate.get(java.util.Calendar.DAY_OF_MONTH);

DatePickerDialog mDatePicker = new DatePickerDialog(Calendar.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
mDateTwoEditText.setText(dayOfMonth + "-" + (month+1) + "-" + year);
mCurrentDate.set(year, month, dayOfMonth);
}
}, year, month, day);
mDatePicker.show();
}

从edittext获取字符串并发布参数..使用volley..这只是代码的一小部分,因为我认为这里没有问题..其他数据插入正确..

final String dateOne = mDateOneEditText.getText().toString().trim();
final String dateTwo = mDateOneEditText.getText().toString().trim();

......

protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("name", name);
                params.put("myName", majName);
                params.put("dateOne", dateOne);
                params.put("dateTwo", dateTwo);

                return params;
            }

我预计插入将是实际选择日期,但插入是 0000-00-00.. 其他数据已正确插入..

【问题讨论】:

  • 您是否检查过 post 变量是否包含预期的日期字符串?

标签: java php android mysql


【解决方案1】:

MySql 默认日期格式为YYYY-MM-DD

将日期格式从 dd-mm-yyyy 更改为 yyyy-mm-dd 就可以了

【讨论】:

  • 所以我不需要这一行: $timestampa = date('Y-m-d', strtotime($dateOne)); ?
  • @DinoKrivičić 检查日期在 php 端是否正确转换。调试你的代码。
  • @RaymondNijland 我认为您的关注应该作为评论发表。编辑修复了该答案中可以修复的任何内容,但如果我错了,请纠正我。
【解决方案2】:

问题出在这里:

$sql = "INSERT INTOhires_bp (suraduju_od, suraduju_do, id_band, id_producer) 值 ($timestampa, $tsa, (SELECT id FROM band WHERE band_name = '$myname'), (SELECT id FROM producer WHERE producer_name = ' $name'))";

'' 缺失 --> $timestampa 和 $tsa..

'$timestampa' 和 '$tsa'

【讨论】:

    【解决方案3】:

    智能对象,而不是哑字符串

    我们在 Java 和 SQL 中都有数据类型,因此请使用它们。仅以字符串进行思考和工作很尴尬,容易出错,并且容易受到SQL-Injection 攻击。

    相比之下,使用适当的数据类型会使您的代码simpler 和更多self-documenting,提供type-safety,并确保valid values

    避免使用旧的日期时间类

    您正在使用糟糕的日期时间类,几年前随着 JSR 310 的采用而被 java.time 类取代。

    java.time

    使用LocalDate 作为仅日期值。此类适用于处理类似于 SQL 标准类型 DATE 的类型的数据库列。

    LocalDate ld = LocalDate.of( 2019 , 1 , 23 ) ;  // January 23, 2019.
    

    使用 JDBC 4.2 及更高版本,传递给数据库。使用prepared statement 来防止 SQL 注入攻击。

    myPreparedStatement.setObject( … , ld ) ;
    

    检索。

    LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
    

    解析字符串

    java.time 类在解析/生成表示日期时间值的字符串时默认使用标准 ISO 8601 格式。

    LocalDate ld = LocalDate.parse( "2019-01-23" ) ;
    

    生成字符串

    生成字符串以显示给用户。使用DateTimeFormatter.ofLocalizedDate 自动本地化,或生成标准 ISO 8601 格式的字符串。

    String output = ld.toString() ;  // Generate string in standard YYYY-MM-DD format.
    

    要本地化,请指定:

    • FormatStyle 确定字符串的长度或缩写。
    • Locale 确定:
      • 人类语言用于翻译日名、月名等。
      • 文化规范决定缩写、大写、标点、分隔符等问题。

    例子:

    Locale l = Locale.CANADA_FRENCH ;   // Or Locale.US, Locale.JAPAN, etc.
    DateTimeFormatter f = 
        DateTimeFormatter
        .ofLocalizedDate( FormatStyle.FULL )
        .withLocale( l )
    ;
    String output = ld.format( f );
    

    mercredi 2019 年 1 月 23 日


    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

    从哪里获得 java.time 类?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2016-05-26
      • 2011-02-05
      相关资源
      最近更新 更多