Для цикла, который увеличивает и вставляет значение из предыдущей строки

Я пытаюсь увеличить значение последней записи, вставленной в таблицу MySQL, на x%, затем вставляю это значение в базу данных и продолжаю до тех пор, пока цикл не закончится, начиная с базового значения 100.

Допустим, я начинаю с a $base_value из 100 в строке номер один, и я хотел бы увеличить это значение на 25% за одну итерацию. Итак, во второй строке я бы хотел, чтобы 100 увеличилось на 25%. В строке номер три значение в строке номер два увеличилось на 25% и т. д., цикл останавливается, когда достигает 100. Как это можно сделать?

$base_value = 100;
$increase_by; // x percent

for($i = 1; $i = 100; $i++)
{
    mysql_query("insert into table values(
       '',
       '$i',
       ''
    )");
}

person user1544711    schedule 23.07.2012    source источник
comment
Прежде всего, если PHP не делает что-то странное, ваше условие цикла for кажется неправильным. Второй оператор, вероятно, должен быть $i <= 100, иначе я не думаю, что цикл вообще запустится, потому что условие будет начинаться как ложное.   -  person David    schedule 23.07.2012
comment
Возможно, вы сможете сделать это на чистом SQL. Просто выполните SELECT, чтобы получить последнюю строку, получите нужное значение, рассчитайте +25% (значение/100*25), а затем используйте новое значение для вашего INSERT.   -  person James P.    schedule 23.07.2012
comment
@David. Это больше похоже на бесконечный цикл.   -  person nickb    schedule 23.07.2012
comment
Строка один в dabatase имеет значение 100 ? Или это $base_value в PHP, для которого установлено значение 100, когда вы запускаете цикл?   -  person James P.    schedule 23.07.2012
comment
базовое значение равно 100 при запуске цикла.   -  person user1544711    schedule 23.07.2012
comment
Хорошо, скорректировал вопрос, чтобы было понятно.   -  person James P.    schedule 23.07.2012
comment
@David, это был бы бесконечный цикл, так как он неоднократно устанавливал бы $ i равным 100. Если бы он написал $i == 100, он действительно никогда не запустился бы.   -  person Lusitanian    schedule 23.07.2012


Ответы (2)


Что-то вроде этого?:

$base_value = 100;
$increase_by; // x percent

for($i = 1; $i <= 100; $i++)
{
    mysqli_query("insert into table values(
       '$base_value',
       '$i',
       ''
    )");
    $base_value = $base_value + ($base_value * $increase_by);
}

Несколько замечаний:

  • Я заменил mysql_query на mysqli_query и предлагаю вам сделать то же самое. PHP также предлагает это.
  • Я изменил условие завершения в вашем цикле for с $i = 100 на $i <= 100. Если бы первый вообще работал, я не уверен, каким было бы поведение. Это установка $i в условном выражении, что, в первую очередь, вы никогда не хотите делать. Но это также означает, что он либо никогда не запустится, либо будет работать бесконечно, в зависимости от того, как он интерпретирует оператор присваивания как логическое значение. Ни один из этих вариантов не является желательным.
  • Эта математика предполагает, что $increase_by имеет правильные десятичные разряды. Если вместо этого вы представляете понятие «25%» с фактическим значением «25», вам придется скорректировать математику, чтобы учесть это несоответствие.
  • Сам SQL-запрос остался нетронутым, потому что я предполагаю, что это надуманный пример. Но на всякий случай стоит указать, что у вас есть третье ненужное значение и что ваша таблица называется table, что, вероятно, плохая идея :)
person David    schedule 23.07.2012

Просто для удовольствия и предположим, что значение в первой строке равно нулю, альтернативой может быть этот SQL-запрос с uid в качестве первичного ключа.

$base_value = 100;
$factor = 1.25; // Take previous value and times it by 125%

// ...

mysqli_query(
"INSERT INTO table (my_value)
SELECT (my_value * $factor) AS my_value FROM table ORDER BY uid DESC LIMIT 1"
);

$base_value *= $factor;

// ...

Однако не рассчитывайте на то, что это будет работать надежно, если у вас есть параллельные операции, и, без тестирования, мое паучье чутье говорит, что на первой итерации возникнет загвоздка, если таблица пуста. В любом случае, не стесняйтесь комментировать. Очевидно, решение @David более разумно :)

person James P.    schedule 23.07.2012