Crear tabla MySQL con variable PHP

Estoy tratando de crear una tabla cuyo nombre es el valor de lo que se almacena dentro de la variable $name. He probado numerosos métodos diferentes, pero ninguno parece funcionar para mí. Aquí está el código que estoy usando actualmente:

 mysql_connect("localhost", "peltdyou_admin", "123456") or die(mysql_error()); 
 mysql_select_db("peltdyou_orders") or die(mysql_error()); 
 mysql_query("CREATE TABLE '" .$_POST['name']. "' ( name VARCHAR(30), age INT, car VARCHAR(30))");

Sé que tiene algo que ver con '" .$_POST['name']. "' pero no puedo averiguar qué. Yo he tratado '$name' en su lugar, que obtiene su valor de más arriba en el código.

Cualquier ayuda sería genial!

preguntado el 12 de junio de 12 a las 20:06

¿Ha intentado generar el SQL que está generando, para que pueda estar seguro de que contiene lo que cree que contiene? -

Nunca use datos POST directamente en ninguna consulta mySQL. -

Que yo sepa, MySQL no requiere comillas alrededor del nombre de la tabla. ¿Has probado a quitar las comillas simples? -

@Hidde, GET, COOKIE o cualquier dato en el que no se pueda confiar. -

Verifique los privilegios para su usuario sql -

6 Respuestas

Use acentos graves alrededor del nombre de la tabla, no comillas. ¡Y escapar de la entrada! Además, si bien esto funciona en localhost, asegúrese de que el usuario que se ejecuta en su servidor de producción tenga la privilegio para CREAR tablas (generalmente no es, AFAIK, en alojamientos compartidos, por supuesto).

Una palabra de advertencia: ¿Está realmente seguro de que desea crear una tabla en una entrada de usuario? ¿Cuántas tablas vas a crear de esta manera? ¿No puedes simplemente rediseñar todo para que insertes valores ¿en lugar?

$name = mysql_real_escape_string($_POST['name']);
mysql_query("CREATE TABLE `".$name."` ( name VARCHAR(30), age INT, car VARCHAR(30))");

Respondido el 12 de junio de 12 a las 20:06

¡Perfecto! Funciona de maravilla, gracias. Aceptaré la respuesta en 4 minutos - user1449737

Las tablas serán creadas por un administrador al agregar nuevos clientes a la base de datos. Para que no sea spam - user1449737

Sugeriría agregar un cliente en una tabla de "clientes", como una nueva fila, no creando una nueva tabla... - damien pirsy

mysql_real_escape_string is absolutamente inútil aquí. - Tu sentido común

Póngalo en otra variable y funcionará, hay un conflicto con el carácter "'" en la variable POST y en mysql_query.

<?php
mysql_connect("localhost", "peltdyou_admin", "123456") or die(mysql_error()); 
mysql_select_db("peltdyou_orders") or die(mysql_error()); 
$name = mysql_real_escape_string($_POST['name']);
mysql_query("CREATE TABLE '$name' ( name VARCHAR(30), age INT, car VARCHAR(30))");
?>

Publiqué este código para ayudarlo en su código, pero usted no debe use las funciones mysql_* debe usar las funciones mysqli_*. Puedes leer más sobre ellos aquí: http://php.net/manual/en/book.mysqli.php

Respondido el 12 de junio de 12 a las 21:06

¿Las declaraciones preparadas funcionan con identificadores? Pensé que funcionaban solo para valores vinculantes: damien pirsy

¡Tienes razón, no lo hacen! Si miras php.net/manual/en/mysqli.prepare.php te dice: PI editará eso. eso fue un error lo siento!!! - dave_peachy

mysql_real_escape_string is absolutamente inútil aquí. - Tu sentido común

Realmente debería usar PDO o MySQLi en lugar de las funciones mysql_*. Las funciones mysql_* están en proceso de quedar obsoletas y están llenas de agujeros de seguridad.

Dicho esto, no necesita citar el nombre de su tabla y, en su lugar, debe usar nada o acentos graves.

Respondido el 12 de junio de 12 a las 22:06

¿Cómo vincula una variable a un identificador usando PDO o mysqli? - damien pirsy

Su consulta se vería como CREATE TABLE :name (name VARCHAR(30), age INT, car VARCHAR(30) y luego $stmt->bindParam(":name", $_POST['name']); Para ver un ejemplo completo querrá encontrar un buen tutorial de PDO que le brinde todos los conceptos básicos. cody covey

¿Estas realmente seguro? Los documentos dicen lo contrario. TAMBIÉN, lee esto: stackoverflow.com/questions/182287/… - damien pirsy

Oh, sí, tienes razón, los identificadores no se pueden hacer con bindParam. Sin embargo, no estoy seguro de por qué rechazó mi respuesta, ya que la respuesta no menciona los parámetros vinculantes ... - cody covey

Tienes razón, leí mal tu respuesta :). Hice una pequeña edición para poder revertir mi voto negativo, ¡lo siento de nuevo! - damien pirsy

Usando el conector Mysqli más nuevo, puede hacer algo como esto: 1. Cree una variable a partir de la entrada del usuario así $variable=$_POST['name'] 2. Use la variable en su consulta como se muestra en el código completo a continuación aquí

$variable=$_POST['name']; mysqli_connect("localhost", "peltdyou_admin", "123456") or die(mysql_error()); mysqli_select_db("peltdyou_orders") or die(mysqli_connect_error()); mysqli_query("CREATE TABLE $variable ( name VARCHAR(30), age INT, car VARCHAR(30))");

Respondido 29 Jul 13, 05:07

$query = "CREATE TABLE $name" . '(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    age INT,
    name  varchar(30),
    car VARCHAR(30)
)';

Respondido 16 Jul 18, 13:07

Quería saber cómo usar la variable como nombre de columna. - Anusha

¿Podemos escribir crear consulta en el bucle foreach y cómo usarlo? Por favor, guíeme: Anusha

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `description` text NOT NULL,
  `price` double NOT NULL,
  `created` datetime NOT NULL,
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

Respondido el 04 de Septiembre de 18 a las 08:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.