Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php函数与查询优化_Php_Mysql_Function - Fatal编程技术网

php函数与查询优化

php函数与查询优化,php,mysql,function,Php,Mysql,Function,我正在学习php,目前正在使用函数。 创建了一个包含两个表的简单数据库:Category和News 我还创建了三个函数:获取新闻标题、获取新闻图片、获取新闻文本 每个函数返回-标题、图像或全文。 现在它的设置如下所示: function get_news_title($id) { $sql = $this->conn->prepare("SELECT title from news WHERE id = :id"); $sql->bindparam(":id",

我正在学习php,目前正在使用函数。 创建了一个包含两个表的简单数据库:Category和News

我还创建了三个函数:获取新闻标题、获取新闻图片、获取新闻文本 每个函数返回-标题、图像或全文。 现在它的设置如下所示:

function get_news_title($id) {
    $sql = $this->conn->prepare("SELECT title from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $title = $row["title"];
}

function get_news_image($id) {
    $sql = $this->conn->prepare("SELECT img from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $img = $row["img"];
}

function get_news_text($id) {
    $sql = $this->conn->prepare("SELECT full_text from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $text = $row["full_text"];
}
function get_news($id,$field) {
    $sql = $this->conn->prepare("SELECT :field from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->bindparam(":field", $field);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $title = $row["title"];
}
每个函数都包含一个查询,但是否有更好的方法?在每个函数中使用查询是一种好的做法。因为如果我调用所有这些函数,那么将运行三个单独的查询

使用这样的东西是不是一个好主意:

function get_news_title($id) {
    $sql = $this->conn->prepare("SELECT title from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $title = $row["title"];
}

function get_news_image($id) {
    $sql = $this->conn->prepare("SELECT img from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $img = $row["img"];
}

function get_news_text($id) {
    $sql = $this->conn->prepare("SELECT full_text from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $text = $row["full_text"];
}
function get_news($id,$field) {
    $sql = $this->conn->prepare("SELECT :field from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->bindparam(":field", $field);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $title = $row["title"];
}

如果您想坚持您的方法并且确信$fields仅由您控制,请尝试以下操作:

     function get_news($id,array $fields) {

        $fields = implode(',', $fields);

        $sql = $this->conn->prepare("SELECT $fields from news WHERE id = :id");
        $sql->bindparam(":id", $id);
        $sql->execute();
        $row=$sql->fetch(PDO::FETCH_ASSOC);
        $title = $row["title"];
    }

这是一件奇怪的事情,但正如您所说的,这是一个学习练习,传递一个参数是您想要选择的列名,这非常简单

function get_news_column($id, $columnname) {
    $sql = $this->conn->prepare("SELECT $columnname from news WHERE id = :id");
    $sql->bindparam(":id", $id);
    $sql->execute();
    $row=$sql->fetch(PDO::FETCH_ASSOC);
    $title = $row["title"];
}


// called like this

$title = get_news_column($id, 'Title');
$img = get_news_column($id, 'img');
$full_text = get_news_column($id, 'full_text');
我建议您在执行此操作时添加一些错误检查。传递不存在的列名也非常简单,这会导致查询失败

如果正在从用户输入(即$\u POST或$\u GET字段)检索您要传递的列名,这将是危险的


不能对列名使用参数。原因:如果数据库不知道它应该使用的列或表等,那么如何编译、优化查询并创建执行计划为什么不使用一个函数来执行一个查询,一次获取所有3列
选择标题、新闻、新闻全文,其中id=:id
@riggsfully我可以这样做,但出于学习目的,我是这样做的。有没有办法在一个函数中执行查询,然后从查询中调用另一个函数中的字段?您看到我的答案了吗?少了什么?评论一下。与我的答案不同的是,你的答案只支持一个列名?只支持你真正提到的列名。但OP似乎一次只想得到一列。正如我在回答中所说的,这是一件奇怪的事情,因为这样得到3列的执行时间将增加三倍多。嗯,但是OP询问如果运行3个查询,这是否不是一个问题-是的,所以我想给出一种方法,只使用一个查询来请求1-3个字段。但是好的。@LBA我们中的任何一方都不太可能从中得到紫外线或其他任何东西,所以继续寻找另一个问题可能更简单谢谢,但一定要检查@RiggsFolly关于安全性的回答!