Все работает, только правильно ли это? (php/ajax, прием отправка формы)

ipokos

Новичок
Добрый день.
Надеюсь не прогадал с выбором раздела :)
Задача примитивна, нужна форма с добавлением полей, кнопкой удалить, добавить (пока без никаких проверок, валидаций, вопросов и т.п.), подгружается ajax-ом

Хочется что б не сильно закидали камнями когда буду показывать, ну хотя бы не насмерть)
По этому и возник вопрос, что из этого совсем плохо?
Или что из плохого нужно исправить в первую очередь?
Как понимаете, вопрос возник из-за отсутствия нормального опыта, по этому буду крайне признателен объективным советам и комментам (если нетерпеж, то можно и потролить =) )
Если по сути:
functions.php

PHP:
<?
function connect_db(){
    require $_SERVER["DOCUMENT_ROOT"] . '/config/config.php';
    $link = mysqli_connect($host, $name, $password, $db);

    if (!$link) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
    }
    return $link;
}
function add_user_query($arr_user){
    $link = connect_db();
    $query = "INSERT INTO users VALUES (NULL,
                                        '".$arr_user['first_name']."',
                                        '".$arr_user['second_name']."',
                                        '".$arr_user['email']."')";
    mysqli_query($link, $query);
    mysqli_close($link);
}
function dell_user_query($arr_user){
    $link = connect_db();
    mysqli_query($link, "DELETE FROM users WHERE `email` = '".$arr_user['email']."'");
    mysqli_close($link);
}
function load_result(){
    $link = connect_db();
    $result = mysqli_query($link, "SELECT first_name, second_name, email FROM users");
    $resultArr = mysqli_fetch_all($result, MYSQLI_ASSOC);
    mysqli_close($link);
    return $resultArr;
}
function print_field($result){
    $number = 0;
        foreach($result as $key => $val)
        {?>
            <div class="row">
                <p id="number"><?= ++$number ?></p>
                <p id="first_name"><?= $result[$key]['first_name'] ?></p>
                <p id="second_name"><?= $result[$key]['second_name'] ?></p>
                <p id="email"><?= $result[$key]['email'] ?></p>
                <p class="control">
                    <span id="del">del</span>
                </p>
            </div>
        <?}
}
?>
proc.php
PHP:
<?php
require 'functions.php';
$action = $_POST['action'];
$first_name = $_POST['first_name'];
$second_name = $_POST['second_name'];
$email = $_POST['email'];

$arr_user = ['first_name' => $first_name,
             'second_name' => $second_name,
             'email' => $email
             ];
$arr = ['first_name', 'second_name', 'email'];
        
switch($action){
    case 'add':
        add_user_query($arr_user);
        break;
    case 'update':
      //  update_user_query($arr_user);
        break;
    case 'dell':
        dell_user_query($arr_user);
        break;
        
}
$result = load_result();
print_field($result);
?>
js
Код:
$(document).ready(function(){
    load_table();
    
    $('.add_user').bind('click', function(){
        $('.fields').show();
        $('.add_user').css('display', 'none');
        
        var button_save = '<input type="button" name="save_user" class="save_user" value="Save user" />';
        var button_cansel = '<input type="button" name="cansel" class="cansel" value="Cansel" />';
        
        $(button_save).appendTo('.fields');
        $(button_cansel).appendTo('.fields');
        
    });
    $('.add-field').on('click','.cansel', function(){
        $('.fields').hide();
        $('.save_user').hide();
        $('.cansel').hide();
        $('.add_user').css('display', 'block');
    });
    $('.add-field').on('click','.save_user', function(){
        var first_name = $('.first_name').val();
        var second_name = $('.second_name').val();
        var email = $('.email').val();
        
        $.ajax({
            type: 'POST',
            url: "inc/proc.php",
            
            data: "action=add&first_name="+first_name+"&second_name="+second_name+"&email="+email,
            success: update_result
        });
        
    });
    
    $('.table').on('click','#del', function(){
       var email = $(this).closest(".row").find("#email").text();
            $.ajax({
            type: 'POST',
            url: "inc/proc.php",
            data: "action=dell&email="+email,
            success: update_result
            });
            
    });
      
        
});


function load_table(action){
    $.ajax({
            type: 'POST',
            url: "inc/proc.php",
            cache: false,
            success: loadResult
        });
}
function loadResult(data){
    $(".table").append(data);
}
function update_result(data){   
    $("div .row").remove();
    $(".table").append(data);
}
function confirm_delete(){
    confirm("Delete?")
}


function show_popup(){
    
    
}
function close_popup(){
    var popup = document.getElementById('popup');
    var overlay = document.getElementById('overlay');
    popup.style.display = 'none';
    overlay.style.display = 'none';
}
Все это "добро" и немного больше лежит тут https://github.com/v-lavr/table_tz
Если у кого то, есть возможно, был бы очень благодарен.

Заранее спасибо.
 

Фанат

oncle terrible
Команда форума
Мой конек - работа с бд, поэтому прокомментирую эту часть.

Работа с БД в твоем коде, увы, ниже плинтуса.
Ты используешь новое расширение mysqli, но при этом механически передрал способ работы с устаревшего mysql.
И в итоге получил две проблемы

- SQL инъекции
- новое соединение с БД на каждый запрос.
- проблемы с кодировками

Поэтому переписываешь свои функции так
PHP:
function connect_db()
{
    static $pdo;
    if (!$pdo) {
        require $_SERVER["DOCUMENT_ROOT"] . '/config/config.php';
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $pdo = new PDO($dsn, $user, $pass, $opt);
    }
    return $pdo;
}

function add_user_query($arr_user){
    $sql = "INSERT INTO users VALUES (NULL, :first_name, :second_name, :email)";
    connect_db()->prepare($sql)->execute($arr_user);
}
function dell_user_query($arr_user){
    $sql = "DELETE FROM users WHERE `email` = :email");
    connect_db()->prepare($sql)->execute($arr_user);
}
function load_result(){
    return connect_db()->query("SELECT first_name, second_name, email FROM users")->fetchAll();
}
Что непонятно - читай здесь: http://phpfaq.ru/pdo
 
Последнее редактирование:

ipokos

Новичок
Мой конек - работа с бд, поэтому прокомментирую эту часть.

Работа с БД в твоем коде, увы, ниже плинтуса.
Ты используешь новое расширение mysqli, но при этом механически передрал способ работы с устаревшего mysql.
И в итоге получил две проблемы

- SQL инъекции
- новое соединение с БД на каждый запрос.
- проблемы с кодировками

Поэтому переписываешь свои функции так
PHP:
function connect_db(){

    static $db;
     if (!$db) {
        require $_SERVER["DOCUMENT_ROOT"] . '/config/config.php';
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $pdo = new PDO($dsn, $user, $pass, $opt);
    }
    return $pdo;
}

function add_user_query($arr_user){
    $sql = "INSERT INTO users VALUES (NULL,:first_name,:second_name,:email)";
    connect_db()->prepare($sql)->execute($arr_user);
}
function dell_user_query($arr_user){
    $sql = "DELETE FROM users WHERE `email` = :email");
    connect_db()->prepare($sql)->execute($arr_user);
}
function load_result(){
    return connect_db()->query("SELECT first_name, second_name, email FROM users")->fetchAll();
}
Что непонятно - читай здесь: http://phpfaq.ru/pdo
Огромное спасибо.
 
Сверху