【问题标题】:how to include a php variable as part of a table name?如何包含一个 php 变量作为表名的一部分?
【发布时间】:2018-10-27 23:54:48
【问题描述】:

我有一个网站,我需要为每个客户使用单独的表名,因为必须通过手动导入始终更新数据。

示例: 堪萨斯用户 newyork_users

我已将全局变量设置为 $client,它将在所有页面上创建状态名称,因此如果我回显“$client”;然后我会在任何页面上看到例如“堪萨斯”。

如果可能的话,我想将此变量作为我的 SQL 查询的一部分包含在内,以便于编写代码:

SELECT "nick, firstname, lastname, cell 
FROM database.$client_members 
where active =1 and id = $user->id";

这样做有可能甚至安全吗?

【问题讨论】:

  • “我需要为每个客户使用单独的表名” - 天哪,你为什么要这样做?
  • 这里有什么不适合你的?你没有告诉我们。
  • 这样做有可能甚至安全吗? 可能 - 是的,安全 - 可能。
  • 他们必须一直向我发送他们更新的会员数据。以这种方式为所有客户端使用一个表将是一场噩梦,必须确保我只擦除正确的客户端数据,然后在不删除错误数据的情况下导入。不过,我目前正在重新考虑这种方法。
  • 您当前的代码接缝很容易受到 SQL 注入攻击..

标签: php mysql


【解决方案1】:

是的,您可以执行以下操作

<?php

$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$client = 'kansas';    

$table_name = "database." . $conn->real_escape_string($client) . "_members";

$query = sprintf("SELECT nick, firstname, lastname, cell 
FROM %s WHERE active = 1 and id = ?", $table_name);

// prepare and bind
$stmt = $conn->prepare($query);
$stmt->bind_param("i", $user->id);

但我认为您应该认真考虑 normalizing 您的数据库以避免此类问题

【讨论】:

  • 即使在访问权限非常有限的网站上所有这些查询都隐藏在密码后面?
  • @user2554201 什么意思?
  • 在 PHP 中用 MySQLi 准备表名是不可能的,在 PDO 中也是不可能的..
  • @RaymondNijland 我再次编辑并感谢您的提醒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多