Как преобразовать значения массива в запрос MySQL, используя PHP SQL Parser?

я использую 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 и извините за любые грамматические ошибки

0

Решение

Чтобы построить запрос из массива, 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 : Я использовал запрос с несколькими указанными вами условиями и снял отступы и разрывы строк, чтобы выяснить позиции, поиграйте с этими значениями, если у вас нет нужного вывода строки, так как это должно быть просто примером.

Я надеюсь, что это помогает или, по крайней мере, дает вам идею и удачи.

2

Другие решения

Честно говоря, я признаю, что не смог полностью понять вопрос. Но пытаясь ответить на это из того, что я смог понять.

Я полагаю, что вы хотите использовать вывод из первого запроса и сгенерировать другой запрос с дополнительным предложением 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 и использовать вместо этого имя этого столбца. Надеюсь, поможет.

0

По вопросам рекламы [email protected]