Помогите пожалуйста с циклами

QuZ

Постоялец
Регистрация
18 Июл 2009
Сообщения
86
Реакции
50
Добрый вечер всем. Приведу грубый кусок кода.

У меня имеется
Код:
$i = 0;
while ($row = mysqli_fetch_array($sql)) {
$result = array_diff($row, $del);
$i++;
}
Предположим, что данный массив содержит в себе - [0] --> name, [0] --> brand, [0] --> url
В данном массиве содержатся наименования колонок mysql таблицы.
Далее, мне необходимо выполнить скул запрос, указав эти значения в селекте и при этом, повторить его $i количество раз.
Приведу скул запрос. Не хочу, для каждой процедуры писать его по 10-ть раз...

Код:
INSERT INTO to_do (art_id,column_name,old_value,new_value)
SELECT art_id,'name',old.name,new.name
FROM new
INNER JOIN old USING(art_idl)
WHERE old.name<>new.name

UNION

SELECT art_id,'brand',old.brand,new.brand
FROM new
INNER JOIN old USING(art_id)
WHERE old.brand<>new.brand

UNION

SELECT art_id,'url',old.url,new.url
FROM new
INNER JOIN old USING(url)
WHERE old.url<>new.url;

Спасибо большое.

p/s/
Если еще подскажите, как в запрос вшить проверку на наличие строк с одинаковым art_id в обоих колонках, а если art_id имеется только в одной колонке, то в таблицу to_do вставляем $art_id, art_id и NEW_RECORD в колонку new_value или DEL_RECORD в old_value.
Можно не в сам запрос, а просто в цикл буду очень рад.
 
Последнее редактирование:
Что-то вроде этого ?

PHP:
$mysqli = new mysqli("localhost", "user", "password", "db");
$sql = '......';
$result = $mysqli->query($sql);

while ($row = $result->fetch_array()) {
    $fields[] = array_diff($row, $del);
}

// Формирование запроса
function prepare_query($fields) {
    $sql = '......' . printf("......", $fields[0][0], $fields[0][1], $fields[0][2])
            . '......' . printf("......", $fields[1][0], $fields[1][1], $fields[1][2])
            . '......' . printf("......", $fields[2][0], $fields[2][1], $fields[2][2])
    return $sql;
}

for ($i = 1; $i <= 10; $i++) {
    $query = prepare_query($fields);
    $mysqli->query($query);
}

Бегло просмотрел запрос.. Вы в данном случае предлагаете из массива многомерного взять наименования столбцов и подставить их в запрос и данный запрос повторить н раз.
Код:
$sql = 'INSERT INTO to_do (art_id,column_name,old_value,new_value)'. printf("SELECT art_id,'$fields[0][0]',old.$fields[0][0],new.$fields[0][0] FROM new INNER JOIN old USING(art_idl) WHERE old.$fields[0][0]<>new.$fields[0][0]) .
UNION"
Но в данном случае, у меня будут повторяться инсерты, мне надо будет проверять наличие элемента в массиве, т.к. $fields[] = array_diff($row, $del); и повторять н раз в зависимости от $i по количеству не пустых элементов в массиве... Может быть есть более изящный способ?

Ладно, впринципе спасибо. Аналогичным способом сделал. Только в цикле собрал запрос, после прибавил уже инсерт.. Кастыль на кастыле - регуляркой убрать последний юнион и т.д...

Array
(
[0] => Array
(
)
[1] => Array
(
)
[2] => Array
(
[0] => art_id
[COLUMN_NAME] => art_id
)
[3] => Array
(
[0] => brand
[COLUMN_NAME] => brand
)
[4] => Array
(
[0] => url
[COLUMN_NAME] => url
)
)
 
Последнее редактирование:
Что-то вроде этого ?

PHP:
$mysqli = new mysqli("localhost", "user", "password", "db");
$sql = '......';
$result = $mysqli->query($sql);

while ($row = $result->fetch_array()) {
    $fields[] = array_diff($row, $del);
}

// Формирование запроса
function prepare_query($fields) {
    $sql = '......' . printf("......", $fields[0][0], $fields[0][1], $fields[0][2])
            . '......' . printf("......", $fields[1][0], $fields[1][1], $fields[1][2])
            . '......' . printf("......", $fields[2][0], $fields[2][1], $fields[2][2])
    return $sql;
}

for ($i = 1; $i <= 10; $i++) {
    $query = prepare_query($fields);
    $mysqli->query($query);
}
<-------------- добавлено через 62121 сек. -------------->
В работе с чистым mysqli нет ничего изящного ) проверять придется на каждом шагу
Чтоб было изящно, нужно использовать фреймворк и модели данных для обращения к БД
И также есть золотое провило - не вкладывать SQL запросы в циклы. Это гарантированно приводит к тормозам.

$fields нужно очистить от пустых элементов, сделать одномерным ассоциативным перед тем, как вкладывать в for,
чтобы получить название поля по константе

PHP:
const MY_TABLE_FIELD = 'brand';
...
function prepare_query($fields) {
...

     if(isset($fields[static::MY_TABLE_FIELD])){
        ...
     }
...
}
 
Назад
Сверху