복붙노트

[SQL] PHP는 PDO에 오래된는 mysql_query 변경

SQL

PHP는 PDO에 오래된는 mysql_query 변경

난 내가 PDO에 변환 할 만 일에 도착하기 위해 고군분투 내 코드에서 오래된는 mysql_query 쿼리가 있습니다.

내 원래의 코드를했다 :

mysql_query("UPDATE people SET price='$price', contact='$contact', fname='$fname', lname='$lname' WHERE id='$id' AND username='$username' ")
or die(mysql_error()); 

지금은 노력하고 있습니다 :

$sql = "UPDATE people SET price='$price', contact='$contact', fname='$fname', lname='$lname' WHERE id='$id' AND username='$username'";
$q   = $conn->query($sql) or die("failed!");

하지만, 작품에 어떤 아이디어를 얻을 수없는 것?

업데이트 된 코드 :

$conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass);


 // check if the form has been submitted. If it has, process the form and save it to the   database
 if (isset($_POST['submit']))
 { 
 // confirm that the 'id' value is a valid integer before getting the form data
 if (is_numeric($_POST['id']))
  {
 // get form data, making sure it is valid
 $id = $_POST['id'];
 $fname = mysql_real_escape_string(htmlspecialchars($_POST['fname']));
 $lname = mysql_real_escape_string(htmlspecialchars($_POST['lname']));
 $contact = mysql_real_escape_string(htmlspecialchars($_POST['contact']));
 $price = mysql_real_escape_string(htmlspecialchars($_POST['price']));


 // check that firstname/lastname fields are both filled in
 if ($fname == '' || $lname == '' || $contact == '' || $price == '' )
 {
 // generate error message
 $error = 'ERROR: Please fill in all required fields!';

 //error, display form
 renderForm($id, $fname, $lname, $contact, $price, $error);
 }
 else
 {
 // save the data to the database
 $username = $_SESSION['username'];

 $query = "UPDATE people 
         SET price=?, 
             contact=?, 
             fname=?, 
             lname=? 
          WHERE id=? AND 
                username=?";
$stmt = $db->prepare($query);
$stmt->bindParam(1, $price);
$stmt->bindParam(2, $contact);
$stmt->bindParam(3, $fname);
$stmt->bindParam(4, $lname);
$stmt->bindParam(5, $id);
$stmt->bindParam(6, $username);    
$stmt->execute();


 // once saved, redirect back to the view page
header("Location: view.php"); 
}

해결법

  1. ==============================

    1.자세한 내용은이 링크를 방문 : PHP PDO를

    자세한 내용은이 링크를 방문 : PHP PDO를

    귀하의 예에 따라,

    <?php
    
        $query = "UPDATE people 
                 SET price=?, 
                     contact=?, 
                     fname=?, 
                     lname=? 
                  WHERE id=? AND 
                        username=?";
        $stmt = $dbh->prepare($query);
        $stmt->bindParam(1, $price);
        $stmt->bindParam(2, $contact);
        $stmt->bindParam(3, $fname);
        $stmt->bindParam(4, $lname);
        $stmt->bindParam(5, $id);
        $stmt->bindParam(6, $username);    
        $stmt->execute();
    
    ?>
    

    PDO는 문과 저장 프로 시저를 준비

  2. ==============================

    2.PDO에 대한 MySQL의 드라이버와 함께 작업 할 때 당신은 항상 비활성화 에뮬레이트 준비된 명령문에있는 것을 참고 :

    PDO에 대한 MySQL의 드라이버와 함께 작업 할 때 당신은 항상 비활성화 에뮬레이트 준비된 명령문에있는 것을 참고 :

    $dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
    
    $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $sql = 'UPDATE people SET';
    $sql.= ' price = :price,';
    $sql.= ' contact = :contact,';
    $sql.= ' fname = :fname,';
    $sq;.= ' lname = :lname';
    $sql.= ' WHERE id= :id AND username = :username';
    
    $stmt = $pdo->prepare($sql);
    
    $stmt->execute(array(
        ':price' => $price,
        ':contact' => $contact,
        ':fname' => $fname,
        ':lname' => $lname,
        ':id' => $id,
        ':username' => $username,
    ));
    

    당신이 볼 수 있듯이 나는 당신이 그들을 많이 가지고 때 이럴 방법이 명확하기 때문에 당신이 무엇을하고 있는지, 명명 된 매개 변수를 사용했다.

    참고 : ircmaxell은 항상 실제 준비된 문을 사용하려면 기본을 얻기에 노력하고 있습니다 만, 그 때까지 (일부 시간이 걸릴 수 있음) 당신은 항상 MySQL 용을 해제해야 할 것이다.

  3. ==============================

    3.당신이 PDO를 사용하는 거라면, 당신은 준비보고 ()하고, 그렇지 않으면 당신은 PDO가 제공하고있는 보안을 상실하고, SQL 주입을 유지하고 실행해야합니다. 따라서, 귀하의 예제를 제공 :

    당신이 PDO를 사용하는 거라면, 당신은 준비보고 ()하고, 그렇지 않으면 당신은 PDO가 제공하고있는 보안을 상실하고, SQL 주입을 유지하고 실행해야합니다. 따라서, 귀하의 예제를 제공 :

    $conn = new PDO(/*connection info*/);
    
    $query = $conn->prepare("UPDATE people "
                          . "SET    price    = :price, "
                          . "       contact  = :contact, "
                          . "       fname    = :fname, "
                          . "       lname    = :lname "
                          . "WHERE  id       = :id "
                          . "  AND  username = :username");
    $result = $query->execute(array(
      ':price'    => $price,
      ':contact'  => $contact,
      ':fname'    => $fname,
      ':lname'    => $lname,
      ':id'       => $id,
      ':username' => $username
    ));
    

    즉 더 느슨한의 방법입니다,하지만 당신은 할 수 bindParam과 기대의 형태의 데이터에 관해서는 명시.

  4. ==============================

    4.PDO 확장을 사용하는 일을 얻을 수있는 여러 가지 방법이 있다는 것입니다 동안 몇 가지 당신은 명확해야한다.

    PDO 확장을 사용하는 일을 얻을 수있는 여러 가지 방법이 있다는 것입니다 동안 몇 가지 당신은 명확해야한다.

    현재 몇 등을 포함한 그 중 하나 인 사용 방법. 그러나이 항상 별도로 바인드 매개 변수에 좋은 아이디어 인이 방지 때문에 SQL 주입 및 더 많은 같은 많은 문제.

    보기에 다른 중요한 일들은 준비하고 실행 문입니다.

    $conn = new PDO("...."); //Creating the handler
    
    //Create the statement
    $stmt = $conn -> prepare("UPDATE people SET price = :price, contact = :contact, fname = :fname, lname = :lname WHERE id= :id AND username = :username");
    
    // Bind the params
    $stml -> bindParam(":contact", $contact, PDO::PARAM_STR); //This way you can also define the DATATYPE of the parameter
    
    //Execute
    $stmt -> execute(array(
       ":price" => $price, //another way of binding the params
       ":fname" => $fname, 
       ":lname" => $lname,
       ":id" => $id, 
       ":username" => $username));
    
  5. from https://stackoverflow.com/questions/12310238/php-changing-old-mysql-query-to-pdo by cc-by-sa and MIT license