0

私のデータベースには次のものがあります。

行 ID - ドライバー ID - ログ ID。

行 ID は一意で、自動インクリメントされます。私が望むのは、ログ ID がそのドライバー ID を持つ各行に対して一意であることです。

たとえば、ドライバー ID 1 で行が挿入されたとします。その行のログ ID を 1 にしたいのですが、次にドライバー ID 1 で行が挿入されたときに、ログ ID を 2 にしたいとします。

どうすればこれを達成できますか?

ところで、データベースには PHPMyAdmin を使用しています。

- - - - - - - - 編集 - - - - - - - - - - -

これは私のPHPにあるものですが、次のように書かれています:

Web ページ: 不正な整数値: 行 1 の列 'FinesCost' の ''

そして、変数をダンプしてこれを取得します: string(2) "16" string(2) "16" string(2) "16" だから、なぜそれが間違った整数値を言っているのか、なぜそれらが未定義であると言っているのか理解できません。それらは非常に明確に定義されています。

PHP エラー ログ: [19-Jul-2013 10:44:18 Europe/Minsk] PHP Notice: 未定義の変数: C:\inetpub\wwwroot\hosting\Dan\JWT\drivers-log-send.php の FinesCostP‌ost2行 336 [19-Jul-2013 10:44:18 ヨーロッパ/ミンスク] PHP 通知: 未定義変数: TravelExpensesPo‌ st2 in C:\inetpub\wwwroot\hosting\Dan\JWT\drivers-log-send.php 行 336

///ドライバーの銀行の詳細を銀行データベースに挿入する PHP

session_start(); 

$host=""; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name=""; // Database name
$tbl_name="jwtdriversbank"; // Table name

$un = "";
$usrname = "";
$usrpass = "";
$userID = "";

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

if(isset ($_SESSION['usrName']))
{
    $usrname = $_SESSION['usrName'];
}
else
{
    echo "4";
}

//var_dump ($usrname);

if(isset ($_SESSION['usrPass']))
{
    $usrpass = $_SESSION['usrPass'];
}
else
{
    echo "5";
}

$sql="SELECT * FROM jwtdrivers WHERE username='$usrname' and password='$usrpass'";
$result=mysql_query($sql);
$rows=mysql_fetch_array($result);

$userID = $rows['id'];

//var_dump ($userID);

if($userID == "")
{
    echo "3";
}
else
{

            $TotalProfitPost = $TotalProfit;
    $LateFeePost = $LateFee;
    $FinesCostPost2 = $FinesCost;
    $TravelExpensesPost2 = $TravelExpenses;
    $FuelCostPost = $FuelCost;
    $CargoDamagePost = $CargoDamage;
    $TruckDamagePost = $TruckDamage;

    var_dump ($TotalProfitPost);
    var_dump($FinesCostPost2);
    var_dump($TravelExpensesPost2);

    $sql="INSERT INTO jwtdriversbank2 (DriverID, LogID, TotalProfit, LateFee, FinesCost, TravelExpenses, FuelCost, CargoDamage, TruckDamage) VALUES ('$userID', COALESCE((Select MAX(LogID) from jwtdriversbank2 tab2 where tab2.DriverID = '$userID'),0)+1,'$TotalProfitPost','$LateFeePost', '$FinesCostP‌ost2' , '$TravelExpensesPo‌​st2' ,'$FuelCostPost','$CargoDamagePost','$TruckDamagePost')";

    $result = mysql_query($sql);

    if($result)
    {
    }
    else
    {
        die(mysql_error());
    }

}
4

2 に答える 2

1

簡単な解決策は、サブクエリを使用して最大ログ (最後のログ ID) を見つけてから、次のようにインクリメントすることです。

Insert into <table_name>
values p_RowID, p_DriverID, COALESCE((Select MAX(Log_id) from <table_name> tab2 where tab2.Driver_id = p_DriverID),0)+1;

p_RowIDとは、テーブルp_DriverIDに挿入するために渡す値です。Coalesce関数は指定された値をチェックし、そうである場合は、NULLそれを 2 番目のパラメーターに置き換えます。0

于 2013-07-18T15:00:11.983 に答える
1

2 つの列の主キーを追加します。

それはトリックを行う必要があります。

ヘルプについては、このリンクを参照してください

ALTER TABLE table_name
ADD CONSTRAINT pk_DriverID PRIMARY KEY (DriverID,LogID)

最初の主キーは不要になるため、削除することを忘れないでください。

編集:他の答えで完成

データを挿入するコードは次のとおりです。

Insert into <table_name>
values p_RowID, p_DriverID, COALESCE((Select MAX(Log_id) from <table_name> tab2 where tab2.Driver_id = p_DriverID),0)+1;

これで質問は終了です。

PHP は変数を読み取れないため、変数を定義しませんでした。あなたのプログラムを VIM エディターで開いたところ、SQL クエリの $FineCostPost2 内に "<200c>" という文字が見つかりました。それを機能させるには、それを変更する必要があります。

于 2013-07-18T15:00:54.450 に答える