在 MySQL 枚举列中插入设置了错误的数据
Insert in MySQL enum column set the wrong data
这是我第一次使用MySQL枚举数据类型,所以我真的不知道如何正确插入这种类型的数据。我有一个 table 包含一个具有枚举类型的列(状态列),当我在此 table 中插入一行时,状态列将包含一个不是我插入的值,例如:
define('INVALID_EMAIL_ADDRESS', 0);
define('EMAIL_EXIST', 1);
define('NO_MX_RECORDS', 2);
define('EMAIL_NOT_EXIST', 3);
define('EMAIL_CHECK_FAILS', 4);
$query_emails = mysqli_query($db_link, "SELECT email_id, email_address FROM emails");
while ($email_row = mysqli_fetch_array($query_emails)) {
$check_email = does_email_exist($email_row[1]);
echo "status: " . $check_email . " " . $email_row[1] . "<br>";
switch($check_email) {
case INVALID_EMAIL_ADDRESS;
//echo $check_email . " " . $email_row[1] . "<br>";
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . INVALID_EMAIL_ADDRESS . " WHERE email_id = " . $email_row[0]);
++$num_invalid_emails;
break;
case EMAIL_EXIST;
echo $check_email . " -- " . $email_row[1] . "<br>"; // this line get echoed
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_EXIST . " WHERE email_id = " . $email_row[0]);
++$num_email_exist;
break;
case NO_MX_RECORDS;
echo $check_email . " -- " . $email_row[1] . "<br>";
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . NO_MX_RECORDS . " WHERE email_id = " . $email_row[0]);
++$num_no_mx_records;
break;
case EMAIL_NOT_EXIST;
echo $check_email . " -- " . $email_row[1] . "<br>"; // this line get echoed too, but the other don't.
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_NOT_EXIST . " WHERE email_id = " . $email_row[0]);
++$num_emails_not_exist;
break;
case EMAIL_CHECK_FAILS;
default;
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_CHECK_FAILS . " WHERE email_id = " . $email_row[0]);
++$num_email_check_fails;
break;
}
}
在这个 table 中,一些电子邮件存在,而另一个不存在,我应该在 table 行中看到的内容:EMAIL_NOT_EXIST
或 EMAIL_EXIST
, 但我看到所有记录都有 NO_MX_RECORDS
.
我做错了什么?
检查您的数据库以及您的枚举字段如何。
假设您使用的是 0 到 4 之间的值,我认为使用枚举是没有用的。使用 tinyint 代替。
如果你像
这样在数据库中设置你的字段状态,枚举就会变得有用
'NOT VALID MAIL', 'MAIL NOT EXIST' // and so on...
所以...选项是这样的:
1) 更改 table - 在 mysql 中更改字段类型
ALTER TABLE `myTable` MODIFY COLUMNS `status` tinyint(1);
如果您 运行 您的实际代码将起作用。
2) 更改代码
在定义中使用
define('INVALID_EMAIL_ADDRESS', 0);
这(对我来说)是一个完美的解决方案......无论如何......如果你的字段 ENUM 处于状态,它应该像之前的例子一样
'NOT VALID MAIL', 'MAIL NOT EXIST' // and so on...
所以你的定义将是
define('INVALID_EMAIL_ADDRESS', 'HOW I AM IN THE ENUM');
3) – Michał Przybyłowicz 说得对。为了获得更好的帮助和信息,您应该将枚举字段转储给我们,HERE 就是这样。
这是我第一次使用MySQL枚举数据类型,所以我真的不知道如何正确插入这种类型的数据。我有一个 table 包含一个具有枚举类型的列(状态列),当我在此 table 中插入一行时,状态列将包含一个不是我插入的值,例如:
define('INVALID_EMAIL_ADDRESS', 0);
define('EMAIL_EXIST', 1);
define('NO_MX_RECORDS', 2);
define('EMAIL_NOT_EXIST', 3);
define('EMAIL_CHECK_FAILS', 4);
$query_emails = mysqli_query($db_link, "SELECT email_id, email_address FROM emails");
while ($email_row = mysqli_fetch_array($query_emails)) {
$check_email = does_email_exist($email_row[1]);
echo "status: " . $check_email . " " . $email_row[1] . "<br>";
switch($check_email) {
case INVALID_EMAIL_ADDRESS;
//echo $check_email . " " . $email_row[1] . "<br>";
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . INVALID_EMAIL_ADDRESS . " WHERE email_id = " . $email_row[0]);
++$num_invalid_emails;
break;
case EMAIL_EXIST;
echo $check_email . " -- " . $email_row[1] . "<br>"; // this line get echoed
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_EXIST . " WHERE email_id = " . $email_row[0]);
++$num_email_exist;
break;
case NO_MX_RECORDS;
echo $check_email . " -- " . $email_row[1] . "<br>";
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . NO_MX_RECORDS . " WHERE email_id = " . $email_row[0]);
++$num_no_mx_records;
break;
case EMAIL_NOT_EXIST;
echo $check_email . " -- " . $email_row[1] . "<br>"; // this line get echoed too, but the other don't.
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_NOT_EXIST . " WHERE email_id = " . $email_row[0]);
++$num_emails_not_exist;
break;
case EMAIL_CHECK_FAILS;
default;
$query = mysqli_query($db_link, "UPDATE mail_list SET status = " . EMAIL_CHECK_FAILS . " WHERE email_id = " . $email_row[0]);
++$num_email_check_fails;
break;
}
}
在这个 table 中,一些电子邮件存在,而另一个不存在,我应该在 table 行中看到的内容:EMAIL_NOT_EXIST
或 EMAIL_EXIST
, 但我看到所有记录都有 NO_MX_RECORDS
.
我做错了什么?
检查您的数据库以及您的枚举字段如何。
假设您使用的是 0 到 4 之间的值,我认为使用枚举是没有用的。使用 tinyint 代替。
如果你像
这样在数据库中设置你的字段状态,枚举就会变得有用'NOT VALID MAIL', 'MAIL NOT EXIST' // and so on...
所以...选项是这样的:
1) 更改 table - 在 mysql 中更改字段类型
ALTER TABLE `myTable` MODIFY COLUMNS `status` tinyint(1);
如果您 运行 您的实际代码将起作用。
2) 更改代码
在定义中使用
define('INVALID_EMAIL_ADDRESS', 0);
这(对我来说)是一个完美的解决方案......无论如何......如果你的字段 ENUM 处于状态,它应该像之前的例子一样
'NOT VALID MAIL', 'MAIL NOT EXIST' // and so on...
所以你的定义将是
define('INVALID_EMAIL_ADDRESS', 'HOW I AM IN THE ENUM');
3) – Michał Przybyłowicz 说得对。为了获得更好的帮助和信息,您应该将枚举字段转储给我们,HERE 就是这样。