1

我正在尝试编写此基本函数以从表中获取值。

<?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
?>

它给出了这个致命错误:

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

4

2 回答 2

2

尽管您拥有这样一个功能的想法非常好,但实现起来却很糟糕。一些基本的缺点是:

  • 每次调用此函数时,您都在连接到数据库
  • 此代码容易发生 SQL 注入
  • 然而它非常不灵活,让你运行与 silly 不同的查询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']))    

简单,强大且可用。

虽然连接字符串更好地移入includes/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);
于 2013-09-03T19:29:35.537 回答
-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
?>
于 2013-09-03T19:27:46.047 回答