0

PHPに投稿するテキストエリアがあります。

PHPスクリプトでは、テキストエリアを改行で分解します。

次に、配列を反復処理するループを作成して、値がMySQLにすでに存在するかどうかを確認します。すでに存在する場合は続行し、存在しない場合は挿入します。

これは私のコードがどのように見えるかです:

$route = $_POST['gatewayvalue'];
$account_number = $_POST['account_number'];
$route = strtoupper($route);

$routelist = explode("\n", $route);
$count = count($routelist);
$invalid = 0;

for($i=0;$i<$count;$i++){
if(preg_match("/000F26/i", $routelist[$i])){
    $routeinsert = str_replace("000F26", "", $routelist[$i]);

    $verify = "SELECT route FROM gw_gateway WHERE route='$routeinsert'";
    $result = mysql_query($verify);
    $row = mysql_fetch_array($result);
    $checkroute = $row['route'];
    if($checkroute == $routeinsert){
        $validate = false;

        $invalid++;

        continue;
    }
    else{
        $validate = true;
    }
}
else{
    $routeinsert = $routelist[$i];

    $verify = "SELECT route FROM gw_gateway WHERE route='$routeinsert'";
    $result = mysql_query($verify);
    $row = mysql_fetch_array($result);
    $checkroute = $row['route'];
    if($checkroute == $routeinsert){
        $validate = false;

        $invalid++;

        continue;
    }
    else{
        $validate = true;
    }
}

if($validate == true){
    $updateroutesql = "INSERT INTO gw_gateway SET route='$routeinsert', gw_reseller1='$account_number'";
    $updateroutesqlres=mysql_query($updateroutesql) or die("Can not perform update query !".mysql_error());
}
}

ただし、2つの同様の値を挿入すると、たとえば、テキストエリアに030301が2回挿入されます。最初の値は拒否されますが、2番目の値は空の値として挿入されます。

私のテーブルには3つのフィールドがあります。

+----------------+-------------+------+-----+---------+-------+
| Field          | Type        | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+-------+
| route          | varchar(20) | NO   | PRI |         |       |
| account_number | varchar(20) | YES  |     | NULL    |       |
| gw_reseller1   | varchar(45) | YES  |     | NULL    |       |
+----------------+-------------+------+-----+---------+-------+

そして、これは私が2つの同様の値を挿入しようとしたときに起こったことです

+----------+----------------+--------------+
| route    | account_number | gw_reseller1 |
+----------+----------------+--------------+
| 030302   | NULL           | NULL         |
| NULL     | 201-000001     |              |
| 030301   | NULL           | 201-000001   |
+----------+----------------+--------------+
4

3 に答える 3

0

代わりにこれを試してください。これは、データベースにデータを挿入する正しい方法です。

$updateroutesql = "INSERT INTO gw_gateway (route,gw_reseller1) VALUES('".$routeinsert".','".$account_number."'";

ただし、最初に、次のように(セキュリティ対策のために)文字列をエスケープします。

$routeinsert = mysql_real_escape_string($routeinsert);
$account_number = mysql_real_escape_string($account_number);
于 2013-01-21T10:20:08.227 に答える
0

まず、コードを短くしてみてください。同じコード部分が2回あり、役に立たない...次に、入力をサニタイズします。最後に、現在非推奨になっているように、PDOまたは少なくともmysqli_*機能を続行します。mysql_*

新しいコード:

$route = strtoupper($_POST['gatewayvalue']);
$account_number = mysql_real_escape_string($_POST['account_number']);

$routelist = explode("\n", $route);
$count = count($routelist);
$invalid = 0;

for($i=0; $i < $count; $i++) {
    if(preg_match("/000F26/i", $routelist[$i])){
        $routeinsert = str_replace("000F26", "", $routelist[$i]);
    } else {
        $routeinsert = $routelist[$i];
    }

    $verify = mysql_query("SELECT 1 FROM gw_gateway WHERE route='" . mysql_real_escape_string($routeinsert) . "' LIMIT 1");
    if(mysql_num_rows($verify) || !trim($routeinsert)) { // if the route is present in DB mysql_num_rows will return 1 row, or when $routeinsert is an empty string - continue...
        $invalid++;

        continue;
    } else {
        $updateroutesql = "INSERT INTO gw_gateway SET route='" . mysql_real_escape_string($routeinsert) . "', gw_reseller1='$account_number'";
        $updateroutesqlres=mysql_query($updateroutesql) or die("Can not perform update query !".mysql_error());
    }

}

この編集されたコードを試してください-大丈夫です。nullまたは空として挿入された値がまだある場合は、テキストエリアに空の行を入力したことを意味します。挿入時にルートが空でないことも確認する必要があります...

于 2013-01-21T10:27:06.473 に答える
0

2回目に同じ値を挿入するときの主キーフィールドが原因で、拒否されました。すでに1回挿入されています。

2つの異なる値で試してください

于 2013-01-21T10:56:11.980 に答える