BG Development


  Reply to this topicStart new topicStart Poll

> PHP - Проверка кое от полетата е променено
miss
Публикувано на: 07-08-2018, 12:18
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



Имам HTML форма със 70+ полета за редактиране на запис в базата данни.
Когато обаче въведа стойност на някое от полетата и събмитна формата, стойността се актуализира в базата данни, но и всички други полета се презписват със стойност 0.

Въпроса ми е как да направя проверка със if(!empty) за толкова много полета, за да може само полето, в което е въведена някаква информация да се презапише?
PMEmail Poster
Top
thrawn
Публикувано на: 07-08-2018, 13:10
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1724
Регистриран на: 17.01.17



Използвай масив или изпращай само данните които трябва да се обновяват.
PMEmail Poster
Top
miss
Публикувано на: 07-08-2018, 14:04
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



QUOTE (thrawn @ 07-08-2018, 13:10)
Използвай масив или изпращай само данните които трябва да се обновяват.

Кода ми без масив и проверки изглежда така:

CODE
if(isset($_POST['submit'])) {
    $brand = $_POST['brand'];
    $model = $_POST['model'];
    $generation = $_POST['generation'];
    $coupe_type = $_POST['field-coupe'];
    $doors = $_POST['field-doors'];
    $engine_modification = $_POST['engine_modification'];
    $power = $_POST['field-power'];
    $top_speed = $_POST['field-speed'];
    $acceleration_100 = $_POST['field-acc'];
    $acceleration_200 = $_POST['field-acc200'];
    $acceleration_300 = $_POST['field-acc300'];
    $deceleration_100 = $_POST['field-dec'];
    $deceleration_200 = $_POST['field-dec200'];
    $fuel_tank = $_POST['field-fueltank'];
    $adblue = $_POST['field-adblue'];
    $prod_start = $_POST['field-prod-start'];
    $prod_end = $_POST['field-prod-end'];
    $seats = $_POST['field-seats'];
    $length = $_POST['field-length'];
    $width = $_POST['field-width'];
    $width_folded_mirrors = $_POST['field-folded-mirrors'];
    $height = $_POST['field-height'];
    $wheelbase = $_POST['field-wheelbase'];
    $front_track = $_POST['field-front-track'];
    $rear_track = $_POST['field-rear-track'];
    $drag_coefficient = $_POST['field-drag-coef'];
    $ride_height = $_POST['field-clearance'];
    $approach_angle = $_POST['field-approach'];
    $departure_angle = $_POST['field-departure'];
    $ramp_angle = $_POST['field-ramp'];
    $climb_angle = $_POST['field-climb'];
    $front_overhang = $_POST['field-front-overhang'];
    $rear_overhang = $_POST['field-rear-overhang'];
    $wading_depth = $_POST['field-wading'];
    $trunk_min = $_POST['field-trunk-min'];
    $trunk_max = $_POST['field-trunk-max'];
    $model_engine = $_POST['field-engine-model'];
    $engine_displacement = $_POST['field-engine-displacement'];
    $engine_max_rpm = $_POST['field-engine-rpm'];
    $torque = $_POST['field-torque'];
    $valvetrain = $_POST['field-valve-train'];
    $cylinders_num = $_POST['field-cylinders-num'];
    $cylinder_bore = $_POST['field-cylinder-bore'];
    $piston_stroke = $_POST['field-piston-stroke'];
    $engine_position = $_POST['field-engine-pos'];
    $compression_ratio = $_POST['field-compression'];
    $cylinder_valves = $_POST['field-valve-num-cylinder'];
    $oil_capacity = $_POST['field-oil-capacity'];
    $coolant_capacity = $_POST['field-coolant'];
    $gears_auto = $_POST['field-gears-auto'];
    $gears_manual = $_POST['field-gears-manual'];
    $turning_diameter = $_POST['field-turning'];
    $fuel_urban = $_POST['field-fuel-urban'];
    $fuel_extraurban = $_POST['field-fuel-extraurban'];
    $fuel_combined = $_POST['field-fuel-combined'];
    $emission_standart = $_POST['field-emission'];
    $dioxide = $_POST['field-dioxide'];
    $kerb_weight = $_POST['field-weight-kerb'];
    $max_weight = $_POST['field-weight-max'];
    $roof_load = $_POST['field-weight-roof'];
    $trailer_load_brakes8 = $_POST['field-trailer8'];
    $trailer_load_brakes12 = $_POST['field-trailer12'];
    $trailer_load_nobrakes = $_POST['field-trailer-nobrakes'];
    $towbar_load = $_POST['field-towbar'];
    $tires_size = $_POST['field-tire-size'];
    $rims_size = $_POST['field-rims-size'];

    $fuel_system = $_POST['field-fuel-system'];
    $turbine = $_POST['field-turbine'];
    $cylinders_pos = $_POST['field-cylinders-pos'];
    $fuel_type = $_POST['field-fuel-type'];
    $wheel_drive = $_POST['field-wheel-drive'];
    $front_suspension = $_POST['field-suspension-front'];
    $rear_suspension = $_POST['field-suspension-rear'];
    $front_brakes = $_POST['field-front-brakes'];
    $rear_brakes = $_POST['field-rear-brakes'];
    $abs = $_POST['field-abs'];
    $steering_type = $_POST['field-steering-type'];
    $power_steering = $_POST['field-steering-power'];
    $note = $_POST['field-textarea'];

    $sql = "UPDATE cars SET power = '$power', top_speed = '$top_speed', acceleration_100 = '$acceleration_100', acceleration_200 = '$acceleration_200', acceleration_300 = '$acceleration_300', deceleration_100 = '$deceleration_100', deceleration_200 = '$deceleration_200', fuel_tank = '$fuel_tank', adblue = '$adblue', production_start = '$prod_start', production_end = '$prod_end', seats = '$seats', length = '$length', width = '$width', width_folded_mirrors = '$width_folded_mirrors', height = '$height', wheelbase = '$wheelbase', front_track = '$front_track', rear_track = '$rear_track', drag_coefficient = '$drag_coefficient', ride_height = '$ride_height', approach_angle = '$approach_angle', departure_angle = '$departure_angle', ramp_angle = '$ramp_angle', climb_angle = '$climb_angle', front_overhang = '$front_overhang', rear_overhang = '$rear_overhang', wading_depth = '$wading_depth', trunk_min = '$trunk_min', trunk_max = '$trunk_max', model_engine = '$model_engine', engine_displacement = '$engine_displacement', engine_max_rpm = '$engine_max_rpm', torque = '$torque', valvetrain = '$valvetrain', cylinders_num = '$cylinders_num', cylinder_bore = '$cylinder_bore', piston_stroke = '$piston_stroke', engine_position = '$engine_position', compression_ratio = '$compression_ratio', cylinder_valves = '$cylinder_valves', oil_capacity = '$oil_capacity', coolant_capacity = '$coolant_capacity', gears_manual = '$gears_manual', gears_auto = '$gears_auto', turning_diameter = '$turning_diameter', fuel_urban = '$fuel_urban', fuel_extra_urban = '$fuel_extraurban', fuel_combined = '$fuel_combined', emission_standart = '$emission_standart', dioxide = '$dioxide', kerb_weight = '$kerb_weight', max_weight = '$max_weight', roof_load = '$roof_load', trailer_load_brakes8 = '$trailer_load_brakes8', trailer_load_brakes12 = '$trailer_load_brakes12', trailer_load_nobrakes = '$trailer_load_nobrakes', towbar_load = '$towbar_load', tires_size = '$tires_size', rims_size = '$rims_size', fuel_system = '$fuel_system', turbine = '$turbine', cylinders_position = '$cylinders_pos', fuel_type = '$fuel_type', wheel_drive = '$wheel_drive', front_suspension = '$front_suspension', rear_suspension = '$rear_suspension', front_brakes = '$front_brakes', rear_brakes = '$rear_brakes', abs = '$abs', steering_type = '$steering_type', power_steering = '$power_steering', note = '$note' WHERE brand_id = '$brand' AND model_id = '$model' AND generation_id = '$generation' AND coupe_id = '$coupe_type' AND modification_id = '$engine_modification' AND doors = '$doors'";

    if(!mysqli_query($dbconnect, $sql))
    {
        echo '<div class="alert alert-danger alert-dismissible fade in alert--align">
            <a href="" class="close" data-dismiss="alert" aria-label="close">&times;</a>
            <strong>Car&#x27;s data was not updated!</strong> <a href="../contacts.php">Contact the Administrator</a> if needed!
            </div>';
    }
    else {
        echo '<div class="alert alert-success alert-dismissible fade in alert--align">
            <a href="" class="close" data-dismiss="alert" aria-label="close">&times;</a>
            <strong>Success!</strong> Car&#x27;s data was updated successfully!
            </div>';
    }
}


В момента се опитвам да направя някакви проверки, но нищо не се получава... Или логиката ми е грешна или бъркам синтаксиса, как би изглеждал кода с проверките?

Тук правя някакви неуспешни опити за проверка:

CODE

$currentData = "SELECT * FROM `dbName` WHERE id='$id'";
$query = 'UPDATE `dbName` SET ';

if($currentData->column1 != $post->column1)
  $updateQuery .= "`column1` =  '$post->column1',";

if($currentData->column2 != $_POST['column1'])
  $updateQuery .= "`column2` =   '$post->column2',";

if($updateQuery != null)
{
   $updateQuery = substr_replace($updateQuery, "", -1)
   $query = $query + $updateQuery + " WHERE id='$id'";
}
PMEmail Poster
Top
thrawn
Публикувано на: 07-08-2018, 14:26
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1724
Регистриран на: 17.01.17



Мислиш ли, че някой изобщо ще седне да го чете това?

Макар, че технически няма проблем да направиш всичко както си го подкарал, то от практическа гледна точка подхода си е еб@л мамата, както и сам усещаш.

Правилния подход е да пратиш само данните които наистина искаш да обновиш, да речем в json формат. Така на сървърът ще можеш да работиш с обект който ще можеш да обходиш с цикъл за да създадеш динамично заявката.

Самото генериране на данните трябва да стане при клиентът (с javascript) като му предложиш за попълване само едно или две полета - данни и евентуално ключ + копчета add и remove.
PMEmail Poster
Top
Golden Gega
Публикувано на: 07-08-2018, 15:05
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 918
Регистриран на: 04.06.10



Всъщност правилния подход се състои от две части (изключваме дизайна на базата и други дивотии като смисленост въобще на упражнението):

1) Кръщаваш name на полетата от HTML формата с точните имена на полетата от таблицата
2) Минаваш с един цикъл целия post (кода е примерен - нямам php среда под ръка а и от доста време не пиша активно. може и провеката за "and" да се направи с аритметичен if, но нали се образоваме):

CODE
$sql = "update tbl set ";

foreach($_POST as $key => $value) {
{
ако в $value има нещо
 {
     ако $sql не завършва със " set "
        $sql .= " and ";
    $sql .= $key . " = '" . $value . "' "; // ама да не забравиш за sql injection;-)))  
 }
}

$aql += " where id = " . $id;


Тоя подход работи само ако всички полета в базата са един тип - текстови, цифрови и т.н.
Не че е проблем да се направи и проверка за тип поле де.

Това мнение е било редактирано от Golden Gega на 07-08-2018, 15:05
PMEmail Poster
Top
berge
Публикувано на: 07-08-2018, 17:39
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 18
Регистриран на: 30.10.17



Да, вземи с javascript само попълнените данни и ги пращаш за презапис само тях. По принцип гледай да товариш clientSide за сметка на serverSide до колкото се може. Т.е. обходи с if чрез js, не чрез php. Мисля най-добре serverSide ползвай само за заявки до минимум и защита, а такива обикновени неща (обхождания, проверки..), които не изискват защита, си давай на javascript да се разправя с тях..

Това мнение е било редактирано от berge на 07-08-2018, 17:55
PMEmail Poster
Top
Expressing
Публикувано на: 07-08-2018, 19:28
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 36
Регистриран на: 22.02.17



Сложи си name атрибут на всяко поле и с един цикъл обикаляй всички Input полета на формата, преди цикъла си правиш един празен обект и if (!value_на_полето) (Note: това проверява за false, "", 0, null и undefined) блъскаш в празния обект key/value като key ти е name полето, а value ти е value-то (очевидно) и го пращаш.

На сървъра с един цикъл си правиш SQL-a и това е. За да не те изненада някой -> http://php.net/manual/en/pdo.prepared-statements.php
PMEmail Poster
Top
Антон Яначков
Публикувано на: 07-08-2018, 21:39
Quote Post



Име: Антон Яначков
Група: Потребител
Ранг: Редовен член

Мнения: 579
Регистриран на: 27.07.16



QUOTE (miss @ 07-08-2018, 12:18)
Имам HTML форма със 70+ полета за редактиране на запис в базата данни.
Когато обаче въведа стойност на някое от полетата и събмитна формата, стойността се актуализира в базата данни, но и всички други полета се презписват със стойност 0.

Въпроса ми е как да направя проверка със if(!empty) за толкова много полета, за да може само полето, в което е въведена някаква информация да се презапише?

Кодът който е показан би работил добре, ако цялата форма, която субмитваш е попълнена. Моето предложение е още при зареждането на формата, тя да се попълни с даните от таблицата. След което можеш да редактираш каквото искаш. Така че още при зареждане на формата отвори съответната таблица от базатаданни, попълни формата и субмитвай на воля. Не е нормално да пишеш нещо в празно поле, без да е сигурно, че точно тази цифра или стринг искаш да поправиш. По принцип трябва да видиш какво поправяш. Сорсът, който представяш ще работи и няма да ти дава нули, само ако ме послушаш и си запълниш формата още при отваряне на страницата.

Това мнение е било редактирано от Антон Яначков на 07-08-2018, 21:40
PMEmail PosterUsers Website
Top
miss
Публикувано на: 08-08-2018, 10:08
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



QUOTE (Антон Яначков @ 07-08-2018, 21:39)
QUOTE (miss @ 07-08-2018, 12:18)
Имам HTML форма със 70+ полета за редактиране на запис в базата данни.
Когато обаче въведа стойност на някое от полетата и събмитна формата, стойността се актуализира в базата данни, но и всички други полета се презписват със стойност 0.

Въпроса ми е как да направя проверка със if(!empty) за толкова много полета, за да може само полето, в което е въведена някаква информация да се презапише?

Кодът който е показан би работил добре, ако цялата форма, която субмитваш е попълнена. Моето предложение е още при зареждането на формата, тя да се попълни с даните от таблицата. След което можеш да редактираш каквото искаш. Така че още при зареждане на формата отвори съответната таблица от базатаданни, попълни формата и субмитвай на воля. Не е нормално да пишеш нещо в празно поле, без да е сигурно, че точно тази цифра или стринг искаш да поправиш. По принцип трябва да видиш какво поправяш. Сорсът, който представяш ще работи и няма да ти дава нули, само ако ме послушаш и си запълниш формата още при отваряне на страницата.

Тази идея ми дойде и на мен след като не успях да направя проверките с php и javascript кое от полетата е попълнено.

Опитах се да я попълня с AJAX, но без успех. Успявам да попълня само select полетата, при <input type="text"> не ми се получава.
PMEmail Poster
Top
Антон Яначков
Публикувано на: 08-08-2018, 16:24
Quote Post



Име: Антон Яначков
Група: Потребител
Ранг: Редовен член

Мнения: 579
Регистриран на: 27.07.16



QUOTE (miss @ 08-08-2018, 10:08)
Опитах се да я попълня с AJAX, но без успех. Успявам да попълня само select полетата, при <input type="text"> не ми се получава.

Е нали ползваш PHP, направи го по най-простия начин. Зареждането на формата да стане още на сървъра в php файла. На клиентската машина ще пристигне запълнена вече форма, след което редактираш колкото полета искаш и субмитваш.
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0