0

jquery関数を使用して新しいレコードを書き込もうとしています。

$.post("insertuser.php",$("#rohanStart").serialize(),function(data){ 
    alert(data);
});

これは機能しているようで、エコーされたstatmenetでアラートを受け取ります。問題は、値がデータベースに書き込まれていないことです。クエリステートメントに何か問題がありますか?

mysql_query("INSERT INTO ajax_demo1( FirstName,LastName,Unit,Group,photo)
        VALUES (
            '".$arr['FirstName']."',
            '".$arr['LastName']."',
            '".$arr['Unit']."',
            '".$arr['Group']."',
            '".$arr['photo']."'
        )");

echo $arr['Group'];
4

1 に答える 1

1

まず、jQueryやフレームワークを使用しないでください。これらは、DOMで正しく機能しない独自のMicrosoft JScript innerHTMLメソッドに依存しているため、スクリプトにかなりのあいまいさが加わります。

次に、データベースに入るデータを正しくエスケープしていません。これは重大なセキュリティの問題です。

第3に、データベースクエリへのアプローチでは、エラー処理を考慮に入れていません。クエリを直接ダンプして、最適なものを期待しているだけです。

以下に示すように、常にクエリに番号を付けて囲む必要があります。エラーに加えて、事前に条件を失敗させるのは良いことですが、データベース構造では、最初に成功し、次にインデントを増やすことができない場合に実行する必要があります(1つのスペースで、水平方向にスクロールする5つの画面があるこのタブの無駄ではありません)。自分のコードのどこにいるかを視覚化できます。

$query1 = "SELECT * FROM table_name WHERE something='value'";
$result1 = mysql_query($query1);

if ($result1)
{
 $row1 = mysql_fetch_assoc($result1);
}
else {mysql_error_report($query1,mysql_error(),__FUNCTION__);}

メインヘッダーに含まれている場合(AJAXを除くすべてのリクエストにメインヘッダーが含まれていますか?)、SQLエラーをログに記録するために使用できるユニバーサルMySQLエラー処理関数が必要です。

以下は、ユニバーサルデータベースエラーハンドラです。訪問者が不便を感じるだけでなく、訪問者が遭遇した問題を確認して修正できるように、HTTP、JavaScript、PHP、およびSQLエラーの管理エラーログを用意する必要があります。

function mysql_error_report($q,$e,$f)
{
 if (isset($_SESSION['database']))
 {
  if (isset($_SESSION['id_member'])) {$id = $_SESSION['id_member'];} else {$id = 0;}
  if (isset($_SESSION)) {$session = mysql_real_escape_string(session_id());} else {$session = 0;}
  $ip = mysql_real_escape_string(getenv('REMOTE_ADDR'));

  $query = mysql_real_escape_string($q);
  $error = mysql_real_escape_string($e);
  $function = mysql_real_escape_string($f);
  if (isset($_SESSION['type'])) {$type = mysql_real_escape_string($_SESSION['type']);} else if (isset($_SESSION['cms_browser'])) {$type = 'Browser';} else {$type = 'Unknown';}
  if (isset($_SERVER['REQUEST_URI'])) {$url = $_SERVER['REQUEST_URI'];} else {$url = '';}
  if (isset($_SERVER['HTTP_USER_AGENT'])) {$ua = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);} else {$ua = '';}

  $query1 = "INSERT INTO log_errors_sql (id_session, type, id_user, date, ip, function, mysql_error, mysql_query, url, user_agent) VALUES ('$session', '$type', '$id', NOW(), INET_ATON('$ip'), '$function', '$error', '$query', '$url', '$ua')";
  $result1 = mysql_query($query1);

  if (!$result1) {mysql_error_report_mail($q,$e,$f,$ua);}
 }
 else {mysql_error_report_mail($q,$e,$f);}
}

このアプローチを使用することで、コーディング慣行をより厳密に強化できます。あいまいさは必要ありません。コーディングの主観性が低いほど、コードで処理できるようになるため、コードについて完全に緊密になりたいと考えています。

また、空白は非常に緩いです。

これ...

INSERT INTO ajax_demo1( FirstName,LastName,Unit,Group,photo)

このようにフォーマットする必要があります...

INSERT INTO ajax_demo1(FirstName, LastName, Unit, Group, photo)

検索と置換に多くの時間を費やしていない場合は、なぜそのような空白を維持することが重要なのかと疑問に思うかもしれません(「高度な検索と置換」を参照してください。これはwine / Linuxで機能し、がらくたを吹き飛ばしますネイティブのLinuxコンソールコマンドのパフォーマンスの面で、安価で、正規表現をサポートしているなど)空白も同じように厳密なアプローチであるため、サイト全体で大量の編集を一瞬で行うことができます。

私のアドバイスに注意する必要がある場合は、AFR(Advanced Find and Replace)を使用して、「mysql_query」のすべてのインスタンスを検索し(ただし、置換はしません)、記述したすべてのフォーマットを修正します。小さなAJAX通知を混ぜると、Altキーを1つ押すことなく、ブラウザを使用しているときにエラーをすぐに確認できます。それが私が転がる方法です。

...そしてもちろん、これを行うとデバッグがはるかに簡単になります。これは魚ではありません、これは釣りです、そして私はそれが役立つことを願っています。

于 2012-07-28T23:55:19.723 に答える