PHP / PDO函数从数据库varriabele参数返回值

时间:2013-09-03 19:21:19

标签: php mysql sql pdo

我正在尝试编写这个基本函数来从表中获取值。

<?php 
    function getvalue($value, $from, $id){
        //Returns the value of a table

        require('includes/connect.php');
        $db = new PDO('mysql:host=localhost;dbname='.$database, $username, $password); 
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

        $sql = "SELECT :value AS value
            FROM :from
            WHERE id = :id
            LIMIT 1";

        $stmt = $db->prepare($sql); 
        $stmt->bindParam(':value', $value, PDO::PARAM_STR); 
        $stmt->bindParam(':from', $from, PDO::PARAM_STR); 
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute(); 
        $data = $stmt->fetch();
        $return = $data['value'];

        return $return;
    }//function
?>

它给出了致命错误:

  

带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在''project'附近使用正确的语法WHERE id ='1''在/functions/getvalue.php:26的第2行'堆栈跟踪:#0 / functions / getvalue .php(26):PDOStatement-&gt; execute()#1 /
  test.php(24):getvalue('tarief','project','1')#26 {main}在第26行的/functions/getvalue.php中抛出

2 个答案:

答案 0 :(得分:2)

虽然你对这种功能的想法非常好,但实施起来却很糟糕。一些基本的缺点是:

  • 每次调用此函数时都要连接到数据库
  • 此代码易于SQL注入
  • 但是它非常不灵活,让你不要运行与愚蠢SELECT ... WHERE id不同的查询。最终,您将学习其他查询,并发现此功能无法使用。

它应该是一个接受带有参数绑定的SQL查询和数组的函数:

<?php 
//Returns the value of a query
function getvalue($sql, $params = array())
{
    global $pdo;
    $stmt = $db->prepare($sql); 
    $stmt->execute($params); 
    return $stmt->fetchColumn();
}

require('includes/connect.php');
$name = getValue("SELECT name FROM users WHERE id =?",array($_GET['id']))    

简单,强大且可用。

连接字符串最好移入include / connect.php

$dsn = "mysql:host=localhost;dbname=$database;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn, $username, $password, $opt);

答案 1 :(得分:-2)

试试这个(确保转义$ value和$ from变量值):

<?php 
    function getvalue($value, $from, $id){
        //Returns the value of a table

        require('includes/connect.php');
        $db = new PDO('mysql:host=localhost;dbname='.$database, $username, $password); 
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

        $sql = "SELECT " . $value . " AS value
            FROM " . $from . "
            WHERE id = :id
            LIMIT 1";

        $stmt = $db->prepare($sql);  
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute(); 
        $data = $stmt->fetch();
        $return = $data['value'];

        return $return;
    }//function
?>