-2

私はMySQLとPHPが初めてです。私はある種のブログのようなプロジェクトに取り組んできました。しかし、古い MySQL は脆弱であるか、簡単にハッキングできると聞きました。そのため、PDO を使用するように提案されました。しかし、このコードを PDO に変換する方法がわかりません。私を助けてください。

<?php

//Start session
session_start();

//Include database connection details
require_once('scripts/dblog.php');

//Array to store validation errors
$errmsg_arr = array();

//Validation error flag
$errflag = false;

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
   $str = @trim($str);
   if(get_magic_quotes_gpc()) {
      $str = stripslashes($str);
   }
   return mysql_real_escape_string($str);
}

//Sanitize the POST values
$username = clean($_POST['username']);
$password = clean($_POST['password']);

//Input Validations
if($username == '') {
   $errmsg_arr[] = 'Username missing';
   $errflag = true;
}

if($password == '') {
   $errmsg_arr[] = 'Password missing';
   $errflag = true;
}

//If there are input validations, redirect back to the login form
if($errflag) {
   $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
   session_write_close();
   header("location: login.php");
   exit();
}

//Create query
$qry="SELECT * FROM member WHERE BINARY username='$username' AND BINARY password='$password'";
$result=mysql_query($qry);

//Check whether the query was successful or not
if($result) {
   if(mysql_num_rows($result) > 0) {
      //Login Successful
      session_regenerate_id();
      $member = mysql_fetch_assoc($result);
      $_SESSION['SESS_MEMBER_ID'] = $member['mem_id'];
      $_SESSION['SESS_FIRST_NAME'] = $member['username'];
      $_SESSION['SESS_LAST_NAME'] = $member['password'];

      session_write_close();
      header("location: post.php");
      exit();
   } else {
      //Login failed
      $errmsg_arr[] = '<div class="alert alert-error">user name and password not found</div>';
      $errflag = true;
      if($errflag) {
         $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
         session_write_close();
         header("location: login.php");
         exit();
      }
   }
} else {
   die("Query failed");
}
?>
4

4 に答える 4

1

この質問はローカライズされすぎており、すでに何度も質問されていますが、より良い実践を示すために

  • パラメータをバインドする必要があります。
  • より少ないコードを書く方が良いです。入力の時間を節約できます
  • タグ wikiの説明に従って接続します

では、どうぞ

session_start();
require_once('scripts/dblog.php');

$sql = "SELECT * FROM member WHERE username=? AND password=?";
$stm = $pdo->prepare($sql);
$stm->execute($_POST);
$row = $stm->fetch();

if($row) {
    session_regenerate_id();
    $_SESSION['user'] = $row;
    $loc ='post.php';
} else {
    $_SESSION['ERRMSG_ARR'] = 'user name and password not found';
    $loc ='login.php';
}
session_write_close();
header("location: $loc");
于 2013-04-30T14:27:05.757 に答える
1

誰もあなたのためにすべてのコードを単純に書くことはできませんが、私はあなたが自分でそれを行うのを助けるための非常に優れたツールを提供します: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers そして、このようにしてあなたはPDOと準備されたステートメントの背後にある理論:)

于 2013-04-30T14:09:07.387 に答える
0

これがあなたを助けることを願っています

<?php
try {
    $dbh=new PDO('mysql:host=localhost;dbname=mysql','user','pass');

    $qry="SELECT * FROM member WHERE BINARY username='$username' AND BINARY password='$password'";
    //$result=mysql_query($qry);
    $result=$dbh->query($qry);
}catch (PDOException $e){
    print "PDO ERROR :".$e->getMessage()."<br/>";
    die();
}






//Check whether the query was successful or not
if($result) {
    if($result->rowCount() > 0) {
        //Login Successful
        session_regenerate_id();
        $member = $result->fetchAll(PDO::FETCH_ASSOC);
        $_SESSION['SESS_MEMBER_ID'] = $member['mem_id'];
        $_SESSION['SESS_FIRST_NAME'] = $member['username'];
        $_SESSION['SESS_LAST_NAME'] = $member['password'];
        session_write_close();
        header("location: post.php");
        exit();
    }else {
        //Login failed
        $errmsg_arr[] = '<div class="alert alert-error">user name and password not found</div>';
        $errflag = true;
        if($errflag) {
            $_SESSION['ERRMSG_ARR'] = $errmsg_arr;
            session_write_close();
            header("location: login.php");
            exit();
        }
    }
}else {
    die("Query failed");
}
$dbh=null; //close pdo
?>
于 2013-04-30T14:19:30.703 に答える
0

次のような文字列であるデータ ソース名を含む PDO オブジェクトを作成する必要があります。

$dsn = "mysql:dbname=DATABASENAME;host=localhost;"; 

このように PDO オブジェクトを作成します。これは基本的に mysql_connect() と同等です。

$database = new PDO($dsn, "Username", "Password");

使用するクエリを実行するには: (mysql_query() と同等)

$query = $database->query("SELECT * FROM table where name = ?", ['Test']);

結果をフェッチするには (mysql_fetch_array() と同等) を使用します$query->fetchAll(PDO::FETCH_OBJ);

于 2013-04-30T14:14:13.010 に答える