【问题标题】:PHP PDO column name thru switch function structurePHP PDO 列名通过 switch 函数结构
【发布时间】:2018-11-29 22:23:57
【问题描述】:

我正在尝试使用 switch 函数来确保我将在 mysql 查询中使用的列名。我对php不够熟悉,无法修复。当前测试回显返回,但不返回查询结果。如果可能的话,我希望保持相同的结构以保持清洁。感谢您的帮助。

我从另一个帖子中获得了切换代码: Can PHP PDO Statements accept the table or column name as parameter?

这是我尝试整合它的尝试:

<?php
//1. Create a database connection
require_once('configfile.php');
    $mysql_host = DB_HOST;
    $mysql_database = DB_NAME;
    $mysql_username = DB_USER;
    $mysql_password = DB_PASS;

try {
    $db = new PDO("mysql:host=$mysql_host; dbname=$mysql_database", $mysql_username, $mysql_password);
    // set the PDO error mode to exception
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8    

} catch (Exception $e) {
    die("Unable to connect: " . $e->getMessage());
}    

$building = $_POST["building"];
$shift = $_POST["shift"];    

function buildQuery( $shift ) 
{
    switch($shift)
    {
        case 'first':
            $column = 'columnA';
            break;    

        case 'second':
            $column = 'columnB';
            break;
    }    

    echo "This is the column : $column"; //testing
}    


try {
    // Return errors
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Begin transaction
    $db->beginTransaction();
// Query 1    

    buildQuery($shift);
    $stm= $db->prepare("SELECT definition FROM schedules
        WHERE building = :building
        AND $column = '1'");             

    $stm->bindParam(':building', $building, PDO::PARAM_STR);     
    $stm->execute();
    foreach( $stm as $row )
    {
        echo $row['definition'] . "|";
    };    

    $db->commit();
    $db = null;        // Disconnect
} catch (Exception $e) {
    // If transaction fail, use checkpoint and rollback
    $db->rollBack();
    echo "ColumnSwitch Failed: " . $e->getMessage().'<br />';
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}    

?>

【问题讨论】:

  • 只是出于好奇,如果$shift 不是“第一”或“第二”会发生什么?
  • @Chris 如果不是第 1 或第 2,如第 3,它将返回空结果。当我取回数据并在那里采取行动时,我会寻找空结果
  • 现在,您的查询看起来像“SELECT definition FROM schedules WHERE building :building AND = '1'”;如果转变不是您所期望的,我建议包括一个默认列或可能添加一个纾困
  • 好的,我会处理那件作品。谢谢克里斯

标签: php mysql pdo


【解决方案1】:

您应该更改buildQuery 以返回您想要的值。

function buildQuery( $shift ) 
{
    switch($shift)
    {
        case 'first':
            $column = 'columnA';
            break;    

        case 'second':
            $column = 'columnB';
            break;
    }    

    return $column;
}  

然后这样称呼它:

$column = buildQuery($shift);

另一种选择是将$column 设为全局变量,但这不是很好的做法,所以我不推荐它。

【讨论】:

  • 添加到为什么它目前不工作,神奇的词是“variable scope”;基本上,$column 的全局值通常不能在函数内部访问,并且函数有自己的 $column 变量。
  • @Cfreak,是的,就是这样,我之前确实尝试过 return $ column 部分,但没有意识到这部分 $column = buildQuery($shift);所以它对我不起作用。计时器到时我将标记为答案。感谢您的快速回复
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多