iT邦幫忙

4

PHP 連載16 - 懶人SQL語法建立

php
  • 分享至 

  • xImage
  •  

其實有跟老鷹答應說要幫忙連載的,不過前提是等工作穩定他會幫忙XD...
但是現在工作不穩定中又被提一次...
還是先PO好了
其實這個是我之前常用的方式
基本上我是不用框架
不過在寫SQL語法的時候也很煩XDDD
所以用點陣列方式來處理SQL語法

使用方式如下

//陣列
$data = array(
'username' => 'Bertie',
'email' => 'bertie@example.com',
);

//範例,查詢資料
$sql = 'SELECT password
FROM user
WHERE ' . sql_build_array('SELECT', $data);

// 範例 更新資料庫
$sql = 'UPDATE user SET ' . sql_build_array('UPDATE', $data) . ' WHERE user_id = ' . (int) $user_id;

//範例,新增資料
$sql = 'INSERT INTO user ' . sql_build_array('INSERT', $data);

function code

function sql_escape($msg){
	return str_replace(array("'", "\0"), array("''", ''), $msg);
}

function _sql_validate_value($var){
	if (is_null($var)){
		return 'NULL';
	}else if (is_string($var)){
		return "'" . sql_escape($var) . "'";
	}else{
		return (is_bool($var)) ? intval($var) : $var;
	}
}

function sql_build_array($query, $assoc_ary = false){
	if (!is_array($assoc_ary)){
		return false;
	}

	$fields = $values = array();

	if ($query == 'INSERT' || $query == 'INSERT_SELECT'){
		foreach ($assoc_ary as $key => $var){
			$fields[] = $key;
			if (is_array($var) && is_string($var[0])){
				// This is used for INSERT_SELECT(s)
				$values[] = $var[0];
			}else{
			$values[] = _sql_validate_value($var);
			}
	    }
	$query = ($query == 'INSERT') ? ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')' : ' (' . implode(', ', $fields) . ') SELECT ' . implode(', ', $values) . ' ';
    }else if ($query == 'MULTI_INSERT'){
		trigger_error('The MULTI_INSERT query value is no longer supported. Please use sql_multi_insert() instead.', E_USER_ERROR);
   	}else if ($query == 'UPDATE' || $query == 'SELECT'){
		$values = array();
		foreach ($assoc_ary as $key => $var){
			$values[] = "$key = " . _sql_validate_value($var);
		}
        $query = implode(($query == 'UPDATE') ? ', ' : ' AND ', $values);
	}
	return $query;
}

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
wiseguy
iT邦超人 1 級 ‧ 2014-04-11 16:39:07

如果這是搭配 MySQL 的 code,那何不直接使用 mysql_real_escape_string() 來代替你所寫的 sql_escape() 就好了?要不然還要考慮雙字元碼或反斜線等問題,容易掛一漏萬。

這是DBAL的一部份
因為這個還算蠻早之前弄得
所以一直沿用到今日

我要留言

立即登入留言