123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- namespace KIF\Dao;
- use KIF\Exception\ParamsException;
- use KIF\Verify;
- /*
- * Sql助手类
- * @author gaoxiaogang@yoka.com
- */
- class SqlHelper {
- /**
- * 转义数据
- * @param mixed $data
- * @param boolean $isQuote 字符串值是否用引号引起来。默认不括起来。
- * @return mixed
- */
- static public function escape($data, $isQuote = false) {
- if (is_int($data)) {
- return strval($data);
- } elseif (is_float($data)) {
- return strval($data);
- } elseif (is_string($data)) {
- if ($isQuote) {
- # 判断值是否需要 quote 起来
- if (self::isWrapperNoQuote($data)) {
- return addslashes(self::UnwrapperNoQuote($data));
- } else {
- return "'" . addslashes($data) . "'";
- }
- } else {
- return addslashes($data);
- }
- } elseif (is_bool($data)) {
- return strval(intval($data));
- } elseif (empty($data)) {
- if ($isQuote) {
- return "''";
- } else {
- return '';
- }
- } elseif (is_array($data)) {
- foreach ($data as &$val) {
- $val = self::escape($val, $isQuote);
- }
- return $data;
- } else {
- return false;
- }
- }
- /**
- * 判断给定的值是否是有效的自增主键值
- * @param mixid $pk
- * @return boolean
- */
- static public function isValidPK($pk) {
- # 对开心用户id的处理有大bug,时间上来不及,先通过所有验证
- return true;
- if (!Verify::unsignedInt($pk)) {
- return false;
- }
- return true;
- }
- /**
- * 判断给定数组的某个key的值,是否是有效的自增主键值
- * @param array $arr
- * @param mixid $key
- * @return boolean
- */
- static public function isValidPKWithArray(array $arr, $key) {
- if (empty($arr)) {
- return false;
- }
- if (!array_key_exists($key, $arr)) {
- return false;
- }
- return self::isValidPK($arr[$key]);
- }
- /**
- *
- * 对值 $str 做包装,表示该值不需要 引(quote) 起来
- * @param string $str
- * @return string
- */
- static public function wrapperNoQuote($str) {
- if (empty($str)) {
- return $str;
- }
- return "NOQUOTE{$str}NOQUOTE";
- }
- /**
- *
- * 是否对值 $str 做了不需要 引(quote) 起来的包装
- * @param string $str
- * @return Boolean
- */
- static public function isWrapperNoQuote($str) {
- if (strpos($str, 'NOQUOTE') !== 0) {
- return false;
- }
- if (strrpos($str, 'NOQUOTE') !== (strlen($str) - strlen('NOQUOTE'))) {
- return false;
- }
- return true;
- }
- /**
- *
- * 去除不 引(quote) 起来的包装
- * @param string $str
- * @return string
- */
- static public function UnwrapperNoQuote($str) {
- return str_replace('NOQUOTE', '', $str);
- }
- /**
- *
- * 将sql里的比较操作符添加到 $val里
- * DBAbstract::parseCondition 方法,会调用 SqlHelper::explodeCompareOperator 方法来拆解值与比较操作符
- * @param string $operator 比较操作符。如: >= 、 < 、!=
- * @param scalar $val 标题数据
- * @throws ParamsException '参数val必须是标量scalar类型'
- * @return string
- */
- static public function addCompareOperator($operator, $val) {
- if (!is_scalar($val)) {
- throw new ParamsException("参数val必须是标量scalar类型");
- }
- $val = "COMPARE{$operator}COMPARE {$val}";
- return $val;
- }
- /**
- *
- * 拆解 $val 里的 比较操作符 与 数据。
- * 如果含比较操作符,则认为比较操作符是 =
- * @param string $val
- * @return string
- */
- static public function explodeCompareOperator($val) {
- $pattern = '#^(\'?)COMPARE(.+?)COMPARE\s{4}#';
- if (!preg_match($pattern, $val, $match)) {
- return " = {$val} ";
- }
- $compareOperator = $match[2];
- $val = preg_replace($pattern, '$1', $val);
- return " {$compareOperator} {$val} ";
- }
- }
|