я использую PHP SQL PARSER
мой код
<?php
require_once dirname(__FILE__) . '/../src/PHPSQLParser.php';
$sql = 'SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID=Customers.CustomerID where
Customers.CustomerName = "Siddhu"';
$sql = strtolower($sql);
echo $sql . "\n";
$parser = new PHPSQLParser($sql, true);
echo "<pre>";
print_r($parser->parsed);
?>
Я получаю вывод, как показано ниже массива
Array (
[SELECT] => Array
(
[0] => Array
(
[expr_type] => colref
[alias] =>
[base_expr] => orders.orderid
[no_quotes] => orders.orderid
[sub_tree] =>
[delim] => ,
[position] => 7
)
[1] => Array
(
[expr_type] => colref
[alias] =>
[base_expr] => customers.customername
[no_quotes] => customers.customername
[sub_tree] =>
[delim] => ,
[position] => 23
)
[2] => Array
(
[expr_type] => colref
[alias] =>
[base_expr] => orders.orderdate
[no_quotes] => orders.orderdate
[sub_tree] =>
[delim] =>
[position] => 47
)
)
[FROM] => Array
(
[0] => Array
(
[expr_type] => table
[table] => orders
[no_quotes] => orders
[alias] =>
[join_type] => JOIN
[ref_type] =>
[ref_clause] =>
[base_expr] => orders
[sub_tree] =>
[position] => 70
)
[1] => Array
(
[expr_type] => table
[table] => customers
[no_quotes] => customers
[alias] =>
[join_type] => LEFT
[ref_type] => ON
[ref_clause] => Array
(
[0] => Array
(
[expr_type] => colref
[base_expr] => orders.customerid
[no_quotes] => orders.customerid
[sub_tree] =>
[position] => 101
)
[1] => Array
(
[expr_type] => operator
[base_expr] => =
[sub_tree] =>
[position] => 118
)
[2] => Array
(
[expr_type] => colref
[base_expr] => customers.customerid
[no_quotes] => customers.customerid
[sub_tree] =>
[position] => 119
)
)
[base_expr] => customers on orders.customerid=customers.customerid
[sub_tree] =>
[position] => 88
)
)
[WHERE] => Array
(
[0] => Array
(
[expr_type] => colref
[base_expr] => customers.customername
[no_quotes] => customers.customername
[sub_tree] =>
[position] => 146
)
[1] => Array
(
[expr_type] => operator
[base_expr] => =
[sub_tree] =>
[position] => 169
)
[2] => Array
(
[expr_type] => const
[base_expr] => "siddhu"[sub_tree] =>
[position] => 171
)
)
)
Теперь я хочу сгенерировать запрос, используя этот массив. Почему я это делаю, позже я добавлю дополнительные параметры в этот массив. как я пропускаю дополнительное условие в предложении WHERE или таблице
НАПРИМЕР:
Предыдущий запрос
$sql = 'SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID=Customers.CustomerID where
Customers.CustomerName = "Siddhu"';
Теперь я хочу передать еще два условия в предложении where, например, после условия WHERE Customers.CustomerID = «123» и status = «Active» и create_by = 1;
так вот мой последний запрос похож
$sql = 'SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID=Customers.CustomerID where
Customers.CustomerName = "Siddhu" AND Customers.CustomerID = "123" and status = "Active" and created_by = 1;
Так как я могу достичь этого, или есть какая-то функция в PHPSQLPARSER использовать этот массив, чтобы иметь какую-либо функцию для генерации запроса? Спасибо за Advance и извините за любые грамматические ошибки
Чтобы построить запрос из массива, PHPSQLParser
имеет creator
метод,
Из документации здесь: Руководство парсера
Есть два способа, которыми вы можете создавать операторы из вывода парсера
Используйте конструктор
Для удобства конструктор просто вызывает метод create () в указанном выводе дерева синтаксического анализатора.
$parser = new PHPSQLParser('select 1');
$creator = new PHPSQLCreator($parser->parsed);
echo $creator->created;
Используйте метод create ()
$parser = new PHPSQLParser('select 2');
$creator = new PHPSQLCreator();
echo $creator->create($parser->parsed);
/* this is okay, the SQL is saved in the _created_ property. */
/* get the SQL statement for the last parsed statement */
$save = $creator->created;
конечно с $parser->parsed
является array
Вы можете вставить свой собственный массив
echo $creator->create($myArray);
Чтобы добавить условие в массив, вы можете добавить его в WHERE
множество условий
каждое условие имеет 3 массива, определяющих colref
(название столбца), operator
(хорошо .. оператор) и const
( Значение )
сложная часть является position
в подчиненном массиве WHERE
так как вам нужно указать, куда именно вы хотите вставить каждый из этих трех, так на основе WHERE
В приведенном вами примере вы можете видеть, что положение оператора =
является 169
( начиная с 0
)
проверьте этот инструмент, чтобы увидеть позиция символа в строке (это начинается с 1).
И исходя из этого Сложный пример
Ваш финал WHERE
Массив должен выглядеть следующим образом (я не уверен, если вам нужно [no_quotes]
ключ хотя):
[WHERE] => Array
(
[0] => Array
(
[expr_type] => colref
[base_expr] => customers.customername
[no_quotes] => customers.customername
[sub_tree] =>
[position] => 146
)
[1] => Array
(
[expr_type] => operator
[base_expr] => =
[sub_tree] =>
[position] => 169
)
[2] => Array
(
[expr_type] => const
[base_expr] => "siddhu"[sub_tree] =>
[position] => 171
)
// adding other conditions
[3] => Array
(
[expr_type] => operator
[base_expr] => and
[sub_tree] =>
[position] => 180
)
[4] => Array
(
[expr_type] => colref
[base_expr] => customers.CustomerID
[no_quotes] => customers.CustomerID
[position] => 184
)
[5] => Array
(
[expr_type] => operator
[base_expr] => =
[sub_tree] =>
[position] => 205
)
[6] => Array
(
[expr_type] => const
[base_expr] => "123"[sub_tree] =>
[position] => 207
)
[7] => Array
(
[expr_type] => operator
[base_expr] => and
[sub_tree] =>
[position] => 213
)
[8] => Array
(
[expr_type] => colref
[base_expr] => status
[no_quotes] => status
[position] => 217
)
[9] => Array
(
[expr_type] => operator
[base_expr] => =
[sub_tree] =>
[position] => 224
)
[10] => Array
(
[expr_type] => const
[base_expr] => "Active"[sub_tree] =>
[position] => 226
)
[11] => Array
(
[expr_type] => operator
[base_expr] => and
[sub_tree] =>
[position] => 235
)
[12] => Array
(
[expr_type] => colref
[base_expr] => created_by
[no_quotes] => created_by
[position] => 239
)
[13] => Array
(
[expr_type] => operator
[base_expr] => =
[sub_tree] =>
[position] => 250
)
[14] => Array
(
[expr_type] => const
[base_expr] => 1
[sub_tree] =>
[position] => 252
)
)
PS : Я использовал запрос с несколькими указанными вами условиями и снял отступы и разрывы строк, чтобы выяснить позиции, поиграйте с этими значениями, если у вас нет нужного вывода строки, так как это должно быть просто примером.
Я надеюсь, что это помогает или, по крайней мере, дает вам идею и удачи.
Честно говоря, я признаю, что не смог полностью понять вопрос. Но пытаясь ответить на это из того, что я смог понять.
Я полагаю, что вы хотите использовать вывод из первого запроса и сгенерировать другой запрос с дополнительным предложением where. Вы можете просто сделать это с помощью простого дополнительного предложения select с CONCAT в самом исходном запросе. Сопоставьте свой жестко запрограммированный исходный запрос с нужными столбцами и создайте динамический SQL в качестве дополнительного выходного столбца.
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate,
CONCAT("SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders LEFT JOIN Customers ON Orders.CustomerID=Customers.CustomerID WHERE Customers.CustomerName = \"Siddhu\"", " AND Customers.CustomerID = \"", Customers.CustomerID, " and status = \"Active\" and created_by = 1;")
FROM Orders
LEFT JOIN Customers ON Orders.CustomerID=Customers.CustomerID
WHERE Customers.CustomerName = "Siddhu"
Если поле состояния также происходит из одной из таблиц, вы можете прервать функцию CONCAT и использовать вместо этого имя этого столбца. Надеюсь, поможет.