1

コードが更新されましたが、まだ機能していません。私は明らかに時代遅れになるmysql関数を使用していることを知っています。しかし、今のところ私が望むのは、このコードが機能することだけです。私が間違っていることを知りたい:(

私はphpとデータベースに非常に慣れていません...単純なhtmlフォームデータをデータベーステーブルに入れるのに苦労しています。そして、私はそれを機能させることができません:(誰か助けて、私のコードの何が問題なのかを確認できますか?私は、フィールド ID、FIRSTNAME、および SURNAME を使用してデータベースに単純なテーブルを作成しました。コードは次のとおりです。

    <?php 
    //connect to database
    $mysql_host = 'localhost';
    $mysql_user = 'root';
    $mysql_pass = '';

    $mysql_db = 'test';

    if (!mysql_connect ($mysql_host, $mysql_user, $mysql_pass)||!mysql_select_db ($mysql_db) ) {
        die(mysql_error());

    }   

    // Code     
    if (isset($_POST['firstname'])&&
    isset($_POST['surname'])) {

    $firstname = $_POST['firstname'];
    $surname = $_POST['surname'];

    if (!empty($username)&&!empty($password)) {
    $query = "INSERT INTO `test`.`test_tabell` 
    VALUES ('', '" . mysql_real_escape_string($firstname) . "', '" . mysql_real_escape_string($surname) . "')";
    /*$query = "INSERT INTO `test`.`test_tabell` VALUES (``, `.$firstname.`, `.$surname.`)"; */
    $query_run = mysql_query($query);
if (!$query_run) echo mysql_error(); 
}
}
    ?>

    <form action="add.php" method="POST">
    Firstname:<br> <input type="text" name="firstname" value="<?php if (isset($firstname)) { echo $firstname; } ?>"><br><br>
    Surname:<br> <input type="text" name="surname" value="<?php if (isset($surname)) { echo $surname; } ?>"><br><br>
    <input type="submit" value="Submit">
    </form> 

ありがとうございました!

4

4 に答える 4

3

mysql 固有の構文を使用しないでください。それは時代遅れであり、高度な処理を行う必要があるときに煩わしくなり始め、sqlite や postgresql に切り替えることができません。

PDO を使用することをお勧めします。次のようなことができます。

// Usage:   $db = connectToDataBase($dbHost, $dbName, $dbUsername, $dbPassword);
// Pre:     $dbHost is the database hostname, 
//          $dbName is the name of the database itself,
//          $dbUsername is the username to access the database,
//          $dbPassword is the password for the user of the database.
// Post:    $db is an PDO connection to the database, based on the input parameters.
function connectToDataBase($dbHost, $dbName, $dbUsername, $dbPassword)
{
    try
    {
         return new PDO("mysql:host=$dbHost;dbname=$dbName;charset=UTF-8", $dbUsername, $dbPassword);
    }
    catch(PDOException $PDOexception)
    {
        exit("<p>An error ocurred: Can't connect to database. </p><p>More preciesly: ". $PDOexception->getMessage(). "</p>");
    }
}

次に、変数を初期化します (データベースの名前を定義するのを忘れたと思います)。

$host = 'localhost';
$user = 'root';
$dataBaseName = 'databaseName';
$pass = '';

これで、次の方法でデータベースにアクセスできます

$GLOBALS['db'] = connectToDataBase($host , $databaseName, $user, $pass);

これで、PDO データベース接続のインスタンスができました。

私が指摘したいことの 1 つは、SQL インジェクションに好感を持っていることです。次のように、クエリで準備済みステートメントを使用したいと考えています。

$query = "INSERT INTO test(first_name, sur_name) VALUES (:firstname, :surname);";

クエリで 2 つの変数 $firstName と $surName を実行して、:firstName と :surName の値を置き換えます。最初に単純な挿入関数を作成することから説明します。

function insertFunction($db, $query, $firstName, $surName)
{
    $statement = $db->prepare($query);
    return $statement->execute(array(":firstName" => $firstName, ":surName" => $surName));
}

だから、あなたが次のようなことをするのは簡単です

$firstName = 'Smith';
$surName = 'John';
$db = $GLOBALS['db'];

$success = insertFunction($db, $query, $firstName, $surName);

$success が true か false かを確認することで、成功したかどうかを確認できます。

PDO のより高度な使用法 (複数行など) を確認したい場合は、ここで私のコメントの 1 つを確認できます: Javascript function as php? (トップコメントではありません)。

これが役立つことを願っています。何か変なところがあればコメントください。

于 2013-03-06T19:43:37.367 に答える
1

スキーマを見ないとわかりにくいですが、これを試してください:

$query = "INSERT INTO `test`.`test_tabell` VALUES ('', '$firstname', '$surname')";
$query_run = mysql_query($query);

アポストロフィの代わりにバッククォートを使用しています。また、クエリが何であるかを定義する前に、クエリを実行しようとしています。

于 2013-03-06T19:32:10.827 に答える
1

あなたの挿入クエリは間違っており、SQL インジェクションに対しても開かれています。それがどうあるべきかは次のとおりです。

$query = "INSERT INTO `test`.`test_tabell` 
    VALUES ('', '" . mysql_real_escape_string($firstname) . "', '" . mysql_real_escape_string($surname) . "')";

backticksallが に変更されていることに注意してくださいapostrophe


また、クエリを定義する前に実行しようとしています。


編集

テーブル定義に関連する情報に従って、idテーブルからフィールドをスキップできます。INSERT クエリは次のようになります。

$query = "INSERT INTO `test`.`test_tabell` (`FIRSTNAME`, `SURNAME`)
    VALUES ('" . mysql_real_escape_string($firstname) . "', '" . mysql_real_escape_string($surname) . "')";
$query_run = mysql_query( $query );
于 2013-03-06T19:32:41.560 に答える
0

コメントに投稿されているように、PHP が更新されるとすぐに機能しないため、「mysql_」で始まる関数を使用/学習/練習しないでください。これらの機能は廃止されつつあります。PHP と SQL データベースの使い方を学べるように頑張ってください。将来役立つことを学んでいることを確認してください。PHP と PDO および mysqli_* 関数の両方に関連するオブジェクト指向プログラミング (OOP) をよく読んでください。

于 2013-03-06T19:38:02.407 に答える