1 | <?php |
||
11 | class SqlBind |
||
12 | { |
||
13 | |||
14 | /** |
||
15 | * Each provider have your own model for pass parameter. |
||
16 | * This method define how each provider name define the parameters |
||
17 | * |
||
18 | * @param Uri $connData |
||
19 | * @return string |
||
20 | */ |
||
21 | 24 | public static function getParamModel(Uri $connData) |
|
29 | |||
30 | /** |
||
31 | * Transform generic parameters [[PARAM]] in a parameter recognized by the provider |
||
32 | * name based on current DbParameter array. |
||
33 | * |
||
34 | * @param Uri $connData |
||
35 | * @param string $sql |
||
36 | * @param array $params |
||
37 | * @return array An array with the adjusted SQL and PARAMs |
||
38 | */ |
||
39 | 24 | public static function parseSQL(Uri $connData, $sql, $params = null) |
|
40 | { |
||
41 | 24 | $paramSubstName = SqlBind::getParamModel($connData); |
|
42 | |||
43 | 24 | $sqlAlter = preg_replace("~'.*?'~", "", $sql); |
|
44 | 24 | preg_match_all( |
|
45 | 24 | "/(?<deliStart>\\[\\[|:)(?<param>[\\w\\d]+)(?<deliEnd>\\]\\]|[^\\d\\w]|$)/", |
|
46 | 24 | $sqlAlter, |
|
47 | 24 | $matches |
|
48 | ); |
||
49 | |||
50 | 24 | $usedParams = []; |
|
51 | |||
52 | 24 | if (is_null($params)) { |
|
53 | 15 | $params = []; |
|
54 | } |
||
55 | |||
56 | 24 | foreach ($matches['param'] as $paramName) { |
|
57 | 16 | if (!array_key_exists($paramName, $params)) { |
|
58 | // Remove NON DEFINED parameters |
||
59 | 2 | $sql = preg_replace( |
|
60 | [ |
||
61 | 2 | "/\\[\\[$paramName\\]\\]/", |
|
62 | 2 | "/:$paramName([^\\d\\w]|$)/" |
|
63 | ], |
||
64 | [ |
||
65 | 2 | "null", |
|
66 | "null$2" |
||
67 | ], |
||
68 | 2 | $sql |
|
69 | ); |
||
70 | 2 | continue; |
|
71 | } |
||
72 | |||
73 | 15 | $usedParams[$paramName] = isset($params[$paramName]) ? $params[$paramName] : null; |
|
74 | 15 | $dbArg = str_replace("_", SqlBind::keyAdj($paramName), $paramSubstName); |
|
75 | |||
76 | 15 | $count = 0; |
|
77 | 15 | $sql = preg_replace( |
|
78 | [ |
||
79 | 15 | "/\\[\\[$paramName\\]\\]/", |
|
80 | 15 | "/:$paramName([^\\w\\d]|$)/", |
|
81 | ], |
||
82 | [ |
||
83 | 15 | $dbArg . '', |
|
84 | 15 | $dbArg . '$1', |
|
85 | ], |
||
86 | 15 | $sql, |
|
87 | 15 | -1, |
|
88 | 15 | $count |
|
89 | ); |
||
90 | } |
||
91 | |||
92 | 24 | return [$sql, $usedParams]; |
|
93 | } |
||
94 | |||
95 | 15 | public static function keyAdj($key) |
|
99 | } |
||
100 |