使用PDO将不同的日期插入MSSQL数据库


Insert different Dates into MSSQL DB using PDO

我想运行一个查询,该查询需要使用MSSQL数据库的一次性查询插入多个值。因此,我想使用PDO。

我的问题是,我需要插入不同日期的值,我不知道如何处理。

我从一个html文本框中获取所有帐户,它看起来像这样:

user|pass
user2|pass2
user3|pass3

从表单中,我获得了其他信息,如优先级(影响创建日期)、区域等,这些信息对整个插入都是相同的。根据优先级的不同,我需要插入不同的日期。当优先级正常时,我想将当前数据库时间与"GETDATE()"一起使用。当优先级紧急或较低时,我想使用硬编码的dateCreated或类似"GETDATE()-1000"的东西。这就是我尝试过的:

// Divide the textarea by line into a string array
$accounts = explode(PHP_EOL, $_POST['accountData']);
// Prepare the Query
    $query = "INSERT INTO accounts (username, password, referral, dateCreated,region,idOrder) VALUES ";
    // Create the multiple value placeholder
    $qPart = array_fill(0, sizeof($accounts), "(:username, :password, :referral, :dateCreated, :region, :idOrder)");
    $query .= implode(",",$qPart);
    $stmt = $dbh->prepare($query);

switch($priority)
{
    case("low"):
        $date="2050-01-01 00:00:00.000";
        foreach($accounts as $item){
            list($user, $pass) = explode("|", $item[$key]);
            $stmt->bindParam(':username', $user);
            $stmt->bindParam(':password', $pass);
            $stmt->bindParam(':referral', $refid);
            $stmt->bindParam(':dateCreated', $date);
            $stmt->bindParam(':region', $region);
            $stmt->bindParam(':idOrder', $idOrder);
        }
    break;
    case("mid"):
        // Here I want to call the getDate() function of the Database for the current Date
        $date="getDate()";
        foreach($accounts as $item){
            list($user, $pass) = explode("|", $item[$key]);
            $stmt->bindParam(':username', $user);
            $stmt->bindParam(':password', $pass);
            $stmt->bindParam(':referral', $refid);
            $stmt->bindParam(':dateCreated', $date);
            $stmt->bindParam(':region', $region);
            $stmt->bindParam(':idOrder', $idOrder);
        }
    break;
    case("high"):
        $date="2000-01-01 00:00:00.000";
        foreach($accounts as $item){
            list($user, $pass) = explode("|", $item[$key]);
            $stmt->bindParam(':username', $user);
            $stmt->bindParam(':password', $pass);
            $stmt->bindParam(':referral', $refid);
            $stmt->bindParam(':dateCreated', $date);
            $stmt->bindParam(':region', $region);
            $stmt->bindParam(':idOrder', $idOrder);
        }
    break;
}
$stmt->execute();

您正在做的事情:

$stmt = $dbh->prepare("INSERT INTO accounts
      (username, password)
      VALUES (:username, :password), (:username, :password)");

我不确定您是否可以在准备好的语句中使用重复的命名参数,但由于bindParam是通过引用的,因此值将是相同的。

每个人都在谈论prep的安全性,但(用dbms的术语来说)它们是为了更快地执行重复查询而开发的。

所以在你的情况下,你可以做这个

$stmt = $dbh->prepare("INSERT INTO accounts 
                  (username, password, refreferral, dateCreated,region,idOrder)
            VALUES(:username, :password, :referral, :dateCreated, :region, :idOrder)";
$stmt->bindParam(':referral', $refid);
$stmt->bindParam(':region', $region);
$stmt->bindParam(':idOrder', $idOrder);
$stmt->bindParam(':username', $user);
$stmt->bindParam(':password', $pass);
foreach($accounts as $item) {
    list($user, $pass) = explode("|", $item[$key]);        
    switch($priotity) {
        case ('low'):
            $stmt->bindParam(':dateCreated', '2050-01-01 00:00:00.000');
            break;
        case('mid'):
            $stmt->bindParam(':dateCreated', 'getDate()', PDO_PARAM_NULL);
            break;
        default:
            $stmt->bindParam(':dateCreated', '2000-01-01 00:00:00.000');
    }
    $stmt->execute();
}

我不确定PDO是否接受该解决方案,即它是否检查变量是否真的为"NULL"