用PDO更改mysql_函数

时间:2014-02-07 19:18:31

标签: php mysql pdo

我需要用PDO用mysql_ *函数重写我的php代码,所以我有:

<?php

$con = mysql_connect('localhost', 'gmaestro_agro', 'pass') or die('Error connecting to server');

mysql_select_db('gmaestro_agro', $con); 

    mysql_select_db('gmaestro_agro', $con);
    $query = "INSERT INTO `stat` (`Name`, `Gender`, `Age`, `Donuts eaten`) VALUES (";
      $query .= "'".mysql_real_escape_string($_POST['Name']) . "', ";
      $query .= "'".mysql_real_escape_string($_POST['Gender']) . "', ";
      $query .= "'".mysql_real_escape_string($_POST['Age']) . "', ";
      $query .= "'".mysql_real_escape_string($_POST['Donuts_eaten']);
      $query .= "')";
    $result = mysql_query($query);
    if($result != false) {
        echo "success!";
    } else {
        echo "an error occured saving your data!";
    }

?>

我试着用这样的PDO函数写这个:

<?php


    /* Your Database Name */
    $dbname = 'gmaestro_agro';

    /* Your Database User Name and Passowrd */
    $username = 'gmaestro_agro';
    $password = 'pass';

     $stmt = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
      $stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



    $sql = "INSERT INTO stat(Name,
            Gender,
            Age,
            Donuts eaten
            ) VALUES (
            :Name, 
            :Gender, 
            :Age, 
            :Donuts_eaten)";

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':Name', $_POST['name'], PDO::PARAM_STR);       
$stmt->bindParam(':Gender', $_POST['gender'], PDO::PARAM_STR); 
$stmt->bindParam(':Age', $_POST['age'], PDO::PARAM_STR);
// use PARAM_STR although a number  
$stmt->bindParam(':Donuts_eaten', $_POST['Donuts_eaten'], PDO::PARAM_STR); 

$stmt->execute(); 
if($stmt != false) {
        echo "success!";
    } else {
        echo "an error occured saving your data!";
    }

    ?>

我什么都没发生任何错误?知道如何解决我的问题吗?

2 个答案:

答案 0 :(得分:0)

您正在混淆变量,$pdo未定义/不是您的数据库连接。

您可以使用以下方法解决此问题:

 $pdo = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

而不是:

 $stmt = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
 $stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

如果表或列名称包含空格,则需要在反引号中引用它们:

        Gender,
        Age,
        `Donuts eaten`
        ) VALUES (

但是第一次更改时,PDO应该抛出异常来向您显示此问题。

答案 1 :(得分:0)

编辑(成功的测试代码)

用于成功插入(测试)的表和数据创建代码。

Donuts_eaten已与下划线而非空格一起使用。

你可以自己做这个:

PHPmyadmin

表创建代码

注意:your_db_name更改为您的数据库名称。

CREATE TABLE `your_db_name`.`stat` (
`Name` VARCHAR( 255 ) NOT NULL ,
`Gender` VARCHAR( 255 ) NOT NULL ,
`Age` INT NOT NULL ,
`Donuts_eaten` INT NOT NULL
) ENGINE = MYISAM 

HTML表单

注意: <input type="text" name="Donuts_eaten"> - Donuts_eatendonuts_eaten不同,请注意小写d

<form action="insert.php" method="post">
Name: 
<input type="text" name="name">
<br>
Gender: 
<input type="text" name="gender">
<br>
Age: 
<input type="text" name="age">
<br>
Donuts eaten: 
<input type="text" name="Donuts_eaten">
<br>
<input type="submit" name="submit" value="Submit">
</form>

<强> PHP / SQL

<?php
/* Your Database Name */
$dbname = 'dbname'; // change this

/* Your Database User Name and Passowrd */
$username = 'username'; // change this
$password = 'password'; // change this

$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO stat (Name,
        Gender,
        Age,
        Donuts_eaten
        ) VALUES (
        :Name, 
        :Gender, 
        :Age, 
        :Donuts_eaten)";

$stmt = $pdo->prepare($sql);

$stmt->bindParam(':Name', $_POST['name'], PDO::PARAM_STR);       
$stmt->bindParam(':Gender', $_POST['gender'], PDO::PARAM_STR); 
$stmt->bindParam(':Age', $_POST['age'], PDO::PARAM_STR);
// use PARAM_STR although a number  
$stmt->bindParam(':Donuts_eaten', $_POST['Donuts_eaten'], PDO::PARAM_STR); 

// old execute
// $stmt->execute(); 
$stmt->execute(array(':Name' => $_POST['name'],':Gender' => $_POST['gender'],':Age' => $_POST['age'],':Donuts_eaten' => $_POST['Donuts_eaten']));
if($stmt != false) {
    echo "success!";
} else {
    echo "an error occured saving your data!";
}

?>

原始答案

由于空间的原因,您需要在反引号(对于您的列名称)中包含Donuts eaten

$sql = "INSERT INTO stat(Name,
        Gender,
        Age,
        `Donuts eaten`
        ) VALUES (
        :Name, 
        :Gender, 
        :Age, 
        :Donuts_eaten)";

不鼓励在列名中使用空格。使用下划线代替表格的列。

另外,改变:

$stmt = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
$stmt->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

为:

$pdo = new PDO("mysql:host=localhost;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

因为您在$pdo

中使用$stmt = $pdo->prepare($sql);