首页 > 解决方案 > 如何将年龄转换为年龄范围并插入数据库

问题描述

我有一项任务必须在一小时内完成。我有一个向数据库添加记录的表单,如下所示

$member_age = $_POST['member_age'];
$ins = @mysql_query("INSERT INTO test SET member_age='$member_age'");

我有一个新任务,需要我获取成员的年龄并将其转换为一个年龄范围,然后最后将该年龄范围插入一个名为age_range.

年龄范围如下:

预期输入可能是 12。遵循此行为的预期输出应该是 10-13。我怎样才能做到这一点?

标签: phpmysqlforms

解决方案


首先也是最重要的,@清楚地表明它mysql_*在 PHP 5.6 之后被贬值了,事实上,完全被删除了(出于某种原因)。因此,为了您的学习利益,我使用 PDO 来回答这个问题。

其次,您的问题非常不清楚,因此我将按照我的看法回答。你可以在 w34l 看到这个工作

更新:PDOStatement::execute()我忘记将绑定值作为数组传递并添加以提供更多信息和“继续”指针的地方存在一些问题。

# Lets first check it is set and is numeric
if ( !isset ( $_POST['member_age'] ) && !is_numeric ( $_POST['member_age'] ) )
    die ( 'Missing argument or argument is not numeric.' );

# Establish connection to DB
try {
    $pdo = new \PDO ( 'mysql:host=localhost;dbname=test;', 'username', 'password' , [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false
    ] );
} catch ( \PDOException $e ) die ( $e->getMessage () ); # Debug

# Insert new record into test
$stmt = $pdo->prepare ( 'INSERT INTO test (member_age) VALUES (?);' );
$stmt->execute ( array ( $_POST['member_age'] ) );

unset($stmt); # Clean up

# Create a configuration for ages
$ageRange = [
    '0-6'   => [0,1,2,3,4,5,6],
    '7-9'   => [7,8,9],
    '10-13' => [10,11,12,13],
    '14-17' => [14,15,16,16]
    # 18+ will be if this returns empty
];

# Loop through age configuration to find age range
foreach ( $ageRange as $range => $ages) {
    if ( in_array ( $_POST['member_age'], $ages ) ) {
       # Insert the age range
       $stmt = $pdo->prepare ( 'INSERT INTO age_range (age_range) VALUES (?)' );
       $stmt->execute ( [$range] );
       exit();
    }
}

# If it got here, they must be 18 or over
$stmt = $pdo->prepare ( 'INSERT INTO age_range (age_range) VALUES (?)' );
$stmt->execute ( ['18+'] );

我假设你有一个表,你想根据给定的值存储用户的年龄范围。因此,如果给定的年龄值为 12,则您希望将 10-13 插入此表中。希望这能回答你的问题。

请注意,您可以使用从表中获取主键$pdo->lastInsertId ()的值。然后,您可以将其附加到您的表格中,以便您可以将信息与表格进行交叉引用,以确保解决方案的完整性。在 DBFiddle 上查看它testage_rangetest

foreach ( $ageRange as $range => $ages) {
    if ( in_array ( $_POST['member_age'], $ages ) ) {
       # Insert the age range
       $stmt = $pdo->prepare ( 'INSERT INTO age_range (age_range, testId) VALUES (?, ?)' );
       $stmt->execute ( array ( $range, $pdo->lastInsertId () ) );
       exit();
    }
}

然后为了测试完整性,你可以使用这样的东西

SELECT test.member_age, age_range.age_range
FROM age_range
INNER JOIN test
ON age_range.testId = test.id;

推荐阅读