簡體   English   中英

數據未通過 PHP 表單保存在數據庫中

[英]Data not being saved in DB via PHP form

我試圖在我的數據庫中保存一些數據,但它只是不保存,沒有拋出錯誤,我使用了echo query_orcN; 查看表單輸入的數據是否有效,並且一切正常,表單最多可以輸入 5 個服務($servicoN),所以 cod 有點重復,因為我是 php 和 mySql 的新手,希望看到一些新手編碼。 我還驗證了選擇使用 if 語句的邏輯也工作正常,所以我將只發布一個服務的案例:...

<?php
   
    include('login/conexao.php'); 
    $nome_cli = $_POST['nome_cli'];
    $nome_orc = $_POST['nome_orc'];
    $obs_trab = $_POST['obs_orc'];
    
    $servico1 = $_POST['serv1'];
    $obs_serv1 = $_POST['obs_serv1'];
    $total1 = $_POST['total1'];
    
    $servico2 = $_POST['serv2'];
    $obs_serv2 = $_POST['obs_serv2'];
    $total2 = $_POST['total2'];
    
    $servico3 = $_POST['serv3'];
    $obs_serv3 = $_POST['obs_serv3'];
    $total3 = $_POST['total3'];
    
    $servico4 = $_POST['serv4'];
    $obs_serv4 = $_POST['obs_serv4'];
    $total4 = $_POST['total4'];
    
    $servico5 = $_POST['serv5'];
    $obs_serv5 = $_POST['obs_serv5'];
    $total5 = $_POST['total5'];
    
    //um serviço
    if($servico1 != '' && $servico2 == '' && $servico3 == '' && $servico4 == '' && $servico5 == ''){
              
            $query_orc1 = "START TRANSACTION;
                          SET @cod_cli = (SELECT cod_cliente
                                          FROM CLIENTE
                                          WHERE nome_cliente = '$nome_cli');
                          INSERT INTO TRABALHO(nome_trabalho, cod_cliente, obs_trabalho, statuspag_trabalho) 
                          VALUES ('$nome_orc', @cod_cli, '$obs_trab', 0);
                          SET @orc = LAST_INSERT_ID();     
                          SET @cod_serv1 = (SELECT cod_servicos
                                          FROM SERVICOS
                                          WHERE descri_servicos = '$servico1');
                          INSERT INTO SERV_TRAB(cod_trabalho, cod_servicos, qtt_serv_trab, obs_serv_trab) 
                          VALUES (@orc, @cod_serv1, $total1, '$obs_serv1');
                          COMMIT;";
            
            if($resultado_query_orc1 = mysqli_multi_query($conexao, $query_orc1))
            {
                    //echo $query_orc1;
                    header('Location: sucesso_orc.php');
                    exit();
            }
            else
            {
                    echo "<h3>Falha </h3>".$valid;
                    echo $result_msg_cliente;
                    

            }}

...我正在使用 myawardspace 來托管我的項目,並且已經將表的引擎設置為 InnoDB,據我所知,它可以支持 TRANSACTION。

已經提前感謝任何人的幫助和關注,這是第一次在這里發布問題,希望它結構合理。

你有兩個問題。 問題 1:腳本未能產生預期結果(即您提出的問題)。 問題 2:缺乏診斷信息。

要解決問題 2,請將以下三行放在腳本的開頭:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

運行帶有此更改的腳本可能會產生錯誤消息,從而為您的腳本提供解決方案。 如果沒有,請運行帶有已知錯誤的簡單 php,例如:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

echo '1' //no semi colon is an error
echo '2';

如果這不會產生任何錯誤消息,則意味着 php 或 Web 服務器(例如 Apache)配置中的某些內容阻止了它們。 查找 php 和 web 服務器(可能是 apache)的錯誤日志。 訪問日志的確切詳細信息可在 myawardspace 中獲得。

解決問題 1 - 您的腳本

每當通過 php 運行 sql 時,需要兩個主要步驟才能使其工作。

STEP 1:驗證sql是否有效。

在 php 腳本中形成 sql 的第一個鏡頭經常包含錯誤。 這意味着開發與數據庫交互的每個 php 腳本的一個重要里程碑是在 php 之外驗證 sql。 一種簡單的方法是在設置 query_orc1 的值后立即放置以下語句:

echo query_orc1;
exit;

這會將腳本試圖運行的 sql 顯示在您的屏幕上。 使用復制/粘貼使用 phpmyadmin 或您的數據庫的任何接口運行 sql。 如果sql有問題,你會在這里看到它們。 如果 sql 按預期運行,那么您就知道創建 sql 的腳本部分正在運行。

STEP 2:修復無法正確提交sql到數據庫的php錯誤。

也許有人可以在沒有錯誤消息的情況下發現此腳本中的錯誤。 如果有人可以為您提供該信息,那就太棒了。 在嘗試對 php.ini 進行故障排除之前,我會專注於讓您的系統向您顯示錯誤消息。

我沒有使用 mysqli 的經驗,因此我使用 PDO。

起初:也許你應該過度考慮 servico1 到 servico5 的第一部分。 也許有更好的解決方案。

我的變化:

  • 從 mysqli 切換到 PDO
  • 添加准備語句
  • 用子選擇替換兩個語句

我希望我對每一個變化都發表了評論。

修改后的代碼:

<?php

include('login/conexao.php');
// Build an PDO Instance (Documentation: https://www.php.net/manual/en/book.pdo.php)
// $db = new PDO("mysql:host=localhost;dbname=test;charset=UTF8", "username", "password", [
//     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
// ]);

$nome_cli = $_POST['nome_cli'];
$nome_orc = $_POST['nome_orc'];
$obs_trab = $_POST['obs_orc'];

$servico1 = $_POST['serv1'];
$obs_serv1 = $_POST['obs_serv1'];
$total1 = $_POST['total1'];

$servico2 = $_POST['serv2'];
$obs_serv2 = $_POST['obs_serv2'];
$total2 = $_POST['total2'];

$servico3 = $_POST['serv3'];
$obs_serv3 = $_POST['obs_serv3'];
$total3 = $_POST['total3'];

$servico4 = $_POST['serv4'];
$obs_serv4 = $_POST['obs_serv4'];
$total4 = $_POST['total4'];

$servico5 = $_POST['serv5'];
$obs_serv5 = $_POST['obs_serv5'];
$total5 = $_POST['total5'];

// switch from
// ($servico1 != '') to !empty($servico1)
// optional, if you like the syntax more, you could use: ($servico1 !== '')
// tripple equals or !== prevents type juggeling
// @see https://www.php.net/manual/en/language.types.type-juggling.php
if (!empty($servico1) && empty($servico2) && empty($servico3) && empty($servico4) && empty($servico5)) {
    // Prepared statment to prevent sqlinjection
    $stmt = $db->prepare("INSERT INTO TRABALHO (
            nome_trabalho,
            cod_cliente,
            obs_trabalho,
            statuspag_trabalho
        ) VALUES (
            :nome_orc,
            (SELECT cod_cliente FROM CLIENTE WHERE nome_cliente = :nome_cli ), -- with subselects we can remove unnecessary sql statments
            :obs_trab,
            0
        )
    ");

    try {
        // Execute the query and bind the named paraments
        // All variables a treated as string
        $stmt->execute([
            'nome_orc' => $nome_orc,
            'nome_cli' => $nome_cli,
            'obs_trab' => $obs_trab
        ]);
    } catch (Exception $e) {
        // @todo handle exception 
        echo $e->getMessage();
        exit;
    }


    $stmt = $db->prepare("INSERT INTO SERV_TRAB (
            cod_trabalho,
            cod_servicos,
            qtt_serv_trab,
            obs_serv_trab
        ) VALUES (
            :orc,
            (SELECT cod_servicos FROM SERVICOS WHERE descri_servicos = :servico1),
            $total1,
            :obs_serv1
        )
    ");

    try {
        // get last inserted id with pdo: $db->lastInsertId()
        $stmt->execute([
            'orc' => $db->lastInsertId(),
            'servico1' => $servico1,
            'obs_serv1' => $obs_serv1
        ]);
    } catch (Exception $e) {
        // @todo handle exception 
        echo $e->getMessage();
        exit;
    }

    // we don't need an if at this point because if an error occures it will throw an exception
    // and the try / catch will catch and handle it
    header('Location: sucesso_orc.php');
    exit;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM