Софтуерно Инженерство
Loading...
+ Нов въпрос
k1op0ly avatar k1op0ly -3 Точки

PHP, MySQL - Промяна на колона в базата данни, само ако полето е променено

Имам HTML форма с 70+ полета за промяна на колони в таблица. HTML формата съдържа текстови, числови и select полета. Когато редактирам някое от полетата и изпратя формата, полето което съм променил се update-ва в базата данни, но другите се презаписват с нули. Как бих могъл да направя проверка с PHP кое/кои от полето/полетата е/са попълнено/попълнени за да може да се актуализира само тяхната информация?

Пробвах със isset, !empty и т.н., но явно нещо аз бъркам в синтаксиса.

Другият вариант е със javascript още при зареждане на страницата да попълня полетата, за които вече съществува стойност в базата данни, така при събмит ако полето не е променено ще се актуализира със същата информация. Как би могло да стане това?

Тагове:
0
PHP Web
NikolayShindarov avatar NikolayShindarov 12 Точки
Best Answer

Няма смисъл да даваш стойности на всяка променлива от пост формата, може направо да сложиш в базата от поста данните, примерно:

 

UPDATE cars SET power = '{$POST['power']}'...

 

Обаче с този код директно гърмиш ако някой иска да ти хакне сайта през mysql injection - google it. Трябва да минаваш през http://php.net/manual/en/mysqli.real-escape-string.php всичко, което вкараваш в базата. 

На въпроса ти: 

if (!empty($_POST)) {
		$sql = "UPDATE cars SET 
	";
	foreach ((array) $_POST as $key => $val) {
		if(trim($val) == "") continue;
		$sql .= "`" . $key . "` = '" . mysqli_real_escape_string($dbconnect, $val) . "', ";
	}
	$sql = substr($sql, 0, -2);
	mysqli_query($dbconnect, $sql);
}


Ако всички полета в базата се казват както полетата във формата, този код трябва да свърши цялата работа на скрипта ти с проверката. Може с доста по-малко код да свършиш същата работа и да не се мъчиш да пишеш. Ако не си запознат със snippets, непременно ги виж, ще ти спестят много време: https://www.youtube.com/watch?v=N_QshKsUXO8

 

Успех.

1
08/08/2018 17:25:02
k1op0ly avatar k1op0ly -3 Точки

Казваш, че с този код:

UPDATE cars SET power = '{$POST['power']}'...

директно гърмя ако някой иска да хакне сайта с sql injection.

Ами ако всички файлове, чрез които правя заявки към базата данни са в админ панел, който от своя страна изисква user и парола, възможно ли е отново да се хакне сайта ако приемем, че достъпът до админ панела е невъзможен?

0
NikolayShindarov avatar NikolayShindarov 12 Точки

Няма никакво значение дали имаш админ панел с парола. Който ти хаква базата, ще я хаква през GET-a (а по принцип може даже и през POST-a). Правилото е просто - ако вкарваш в базата променлива, която някой може да вкара от някъде в сайта ти - GET, POST, трябва да я минеш през mysql _escape_string. Иначе всеки може да прави каквото си иска. 

0
dvdty avatar dvdty 472 Точки

Покажи някакъв код.

0
k1op0ly avatar k1op0ly -3 Точки

Ето кода за събмитване на формата:

<?php
    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>';
        }
    }
?>

 

0
dvdty avatar dvdty 472 Точки

В query-то set-ваш всяка една променлива без проверки дали да празни или не.

Няма да коментирам за другите мазала в кода...

0
k1op0ly avatar k1op0ly -3 Точки

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

-3
08/08/2018 18:33:18