【问题标题】:Did I do PDO right? First timer at prepared statements我做 PDO 对吗?准备好的语句的第一个计时器
【发布时间】:2019-07-11 19:46:21
【问题描述】:

刚刚更改了我之前的问题,以反映每个人都告诉我要做的 PDO 更改。我这样做对吗?错误报告对吗?一切都安全吗?

刚刚更改了我之前的问题,以反映每个人都告诉我要做的 PDO 更改。我这样做对吗?错误报告对吗?一切都安全吗?

try{
$connection = new PDO('mysql:host=supertopsecret;dbname=supertopsecret;charset=utf8mb4', 
'supertopsecret', 'supertopsecret');
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

//Query 1 - Insert Provider's Name
//if(isset($_POST['submit'])){ delete this? do I still use this? halp
$stmt1 = $connection->prepare("INSERT INTO 
`providers`(provider_first_name,provider_last_name,date_added)
VALUES (:providerfirstname, :providerlastname, NOW())");

//bind parameters:
  $stmt1->bindParam(':providerfirstname', $providerfirstname);
  $stmt1->bindParam(':providerlastname', $providerlastname);

//insert row
  $providerfirstname = $_POST['providerfirstname'];
  $providerlastname = $_POST['providerlastname'];

  $stmt1->execute();

//Query 2 - Insert Practices
$prov_id = $connection->lastInsertId();
  /*Get all values of practice_name[]:*/
  $practicename = $_POST['practice_name'];
  for ($i = 0; $i < count($practicename); $i++) {
      if ($practicename[$i]) {
          $practice_name_data = $practicename[$i];


      $stmt2 = $connection->prepare("INSERT INTO 
practices(prov_id,practice_name) VALUES (:prov_id,:practice_name)");

      $stmt2->bindParam(':prov_id', $prov_id);
      $stmt2->bindParam(':practice_name', $practice_name_data);

      $stmt2->execute();
     }
  }


echo '<center><h3><br><br><br>Thank you! Your provider has 
successfully been submitted to the database!</center></h3></br>';

} catch(PDOException $e){
echo "Sorry, there was an problem submitting your provider to the 
database. Please try again or copy and paste the error code below to 
the \"Report a Problem\" page and we will try to correct the problem. 
</b></br></br> Error: " . $e->getMessage();
die();
}
$connection = null;

【问题讨论】:

  • 确切的错误是什么?
  • 1您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的“1”附近使用正确的语法您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“1”附近使用正确的语法
  • echo $practicename[0]; 并检查是否有数据。
  • 是不是因为我没有转义providername?
  • Codebreaker,数据和我输入的一模一样

标签: php mysql syntax insert


【解决方案1】:

您应该使用准备好的语句而不是转义自己,请参阅How can I prevent SQL injection in PHP?。但它可能是'$practicename[$i]'。应该是'{$practicename[$i]}',但更简单:

foreach($practicename as $value){
   if($value!=""){
       $value =  mysqli_real_escape_string($connection, $value);
       $query2 = mysqli_query($connection,
       "INSERT INTO `practices`(prov_id,practice_name) 
        VALUES ('$prov_id','$value')");
   }
}

但同样,放弃这个并使用Prepared Statements

【讨论】:

  • 好的,我将从 mysqli 转义切换到 PDO,看看是否可以解决问题,我想我是时候开始这样做了,谢谢
  • PDO 是首选,我会切换,但请参阅我的第二个 mysqli 链接。
  • 我准备好的报表看起来如何?我更新了上面的代码
【解决方案2】:

检查一下它可能会对您有所帮助。使用 PDO 进行插入。

$connection = new PDO("mysql:host=xxxx;dbname=xxxx;", "xxxx", "xxxx"); //database connection

for ($i = 0; $i < count($practicename); $i++) {
    if ($practicename[$i]) {
        $practice_name_data = $practicename[$i];

        $statement = $connection->prepare('INSERT INTO practices(prov_id,practice_name) VALUES (:prov_id,:practice_name)');

        $statement->bindParam(':prov_id', $prov_id);
        $statement->bindParam(':practice_name', $practice_name_data);
        // etc.

        $statement->execute();
    }
}

【讨论】:

  • 非常有帮助,我从未使用过 PDO,所以我有点迷茫,谢谢!!
  • 欢迎来到 PDO。干杯! :) :) @mb9393
  • 如果我使用这个,我会完全放弃使用 mysqli_real_escape_string 吗?
  • 你可以在这里使用foreach而不是for循环。
  • 我准备好的报表看起来如何?我更新了上面的代码
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2014-11-22
  • 2011-07-13
  • 2017-09-29
  • 2014-07-20
相关资源
最近更新 更多