在PHP中更容易更改大型SQL语句

时间:2014-10-31 11:12:21

标签: php sql pdo

我在我正在构建的应用程序中有以下代码并且说实话......当我想要改变这样的事情时,感觉就像是一种痛苦。我在代码中总是遇到SQL问题但从未理解如何解决它。是否有某些方法或常见做法可以使SQL在这里更容易维护和更改? (我已经读过不使用存储过程)

$stmt_arr = array(
            ':steamid' => isset($playerSummary['steamid']) ? $playerSummary['steamid'] : "",
            ':personaname' => isset($playerSummary['personaname']) ? utf8_encode($playerSummary['personaname']) : "",
            ':community_vis_state' => isset($playerSummary['communityvisibilitystate']) ? $playerSummary['communityvisibilitystate'] : "",
            ':profile_state' => isset($playerSummary['profilestate']) ? $playerSummary['profilestate'] : "NULL",
            ':profile_url' => isset($playerSummary['profileurl']) ? $playerSummary['profileurl'] : "",
            ':avatar_url' => isset($playerSummary['avatar']) ? $playerSummary['avatar'] : "",
            ':avatar_medium' => isset($playerSummary['avatarmedium']) ? $playerSummary['avatarmedium'] : "",
            ':avatar_full' => isset($playerSummary['avatarfull']) ? $playerSummary['avatarfull'] : "",
            ':shallow_update' => $isFriend
        );          
        $stmt = $this->DBH->prepare("INSERT INTO `user`(`steamid`, `personaname`, `community_visibility_state`, "
                . "`profile_state`, `profile_url`, `avatar_url`, `avatar_medium_url`, `avatar_full_url`, `last_updated`, `shallow_update`)"
                . " VALUES (:steamid, :personaname, :community_vis_state, :profile_state, :profile_url, "
                . ":avatar_url, :avatar_medium, :avatar_full, NOW(), :shallow_update) "
                . "ON DUPLICATE KEY UPDATE `steamid` = VALUES(`steamid`), "
                . "`personaname` = VALUES(`personaname`), "
                . "`community_visibility_state` = VALUES(`community_visibility_state`), "
                . "`profile_state` = VALUES(`profile_state`), "
                . "`profile_url` = VALUES(`profile_url`), "
                . "`avatar_url` = VALUES(`avatar_url`), "
                . "`avatar_medium_url` = VALUES(`avatar_medium_url`), "
                . "`avatar_full_url` = VALUES(`avatar_full_url`), "
                . "`last_updated` = VALUES(`last_updated`),"
                . "`shallow_update` = VALUES(`shallow_update`)");
        $stmt->execute($stmt_arr);

3 个答案:

答案 0 :(得分:0)

使用此功能

function pdo_insert($con, $table, $data_arr)
{
    if (!is_array($data_arr) || !count($data_arr)) return false;

    $bind = ':'.implode(',:', array_keys($data_arr));

    $sql  = 'INSERT into '.$table.'('.implode(',', array_keys($data_arr)).') '.
          'values ('.$bind.')';
    $stmt = $con->prepare($sql);
    $status = $stmt->execute(array_combine(explode(',',$bind), array_values($data_arr)));

    if($status)
    {
      // success
      $msg = 'Data added to database successfully';
      return $msg;
    }
    else
    {
      // failure
      $msg = 'Error in adding data into database';
      return $msg;
    }
}

调用函数

$msg = pdo_insert($db, 'table name here', $_POST);

// see the result
echo $msg;

答案 1 :(得分:0)

function generateSQL($table, $arr) {
    $sql = "INSERT INTO ".$table . " (";
    foreach($arr as $k => $v) {
        $sql .= "`".substr_replace($k, "", 0, 1)."`, ";
    }
    $sql = substr_replace($sql, "", -2);
    $sql .= ") VALUES (";
    foreach($arr as $k => $v) {
        $sql .= $k.", ";
    }
    $sql = substr_replace($sql, "", -2);
    $sql .= ") ON DUPLICATE KEY UPDATE ";
    foreach($arr as $k => $v) {
        $sql .= "`".substr_replace($k, "", 0, 1)."` = VALUES(`".substr_replace($k, "", 0, 1)."`), ";
    }
    $sql = substr_replace($sql, "", -2);

    return $sql;
}

print_r(generateSQL("user", $stmt_arr));

答案 2 :(得分:0)

您在哪里阅读不使用存储过程?

它们是您问题的解决方案,当查询变得复杂时,最好将逻辑移到一个sotored过程并执行它(例如CALL sp_isnert_user ?, ?

它们还允许您维护/修改SQL逻辑,而无需真正触及您的代码。