[英]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 的第一部分。 也許有更好的解決方案。
我希望我對每一個變化都發表了評論。
<?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.