← PHP

"Insert into" com "Array"

Lida 6721 vezes

Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Na tentativa de tentar simplificar o meu código, fiquei encalhado:


Código: [Seleccione]
$valor = $_POST['valor'];

$post_vars = array('iphone3g1', 'iphone3g2', 'nome', 'iphone41', 'postal', 'apelido');
foreach($post_vars as $var) {
    $$var = "'" . mysql_real_escape_string($_POST[$var]). "', ";
}

$sql = "INSERT INTO clientes (iphone3g1, iphone3g2, nome, iphone41, postal, apelido, valor) VALUES ($var '$valor')";
$query= mysql_query($sql);




Alguém quer dar uma dica?
Offline

apaulo 
Membro
Mensagens 345 Gostos 2
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Código: [Seleccione]
$$var = "'" . mysql_real_escape_string($_POST[$var]). "', ";
Dois $ em frente a var...
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Na tentativa de tentar simplificar o meu código, fiquei encalhado:


Código: [Seleccione]
$valor = $_POST['valor'];

$post_vars = array('iphone3g1', 'iphone3g2', 'nome', 'iphone41', 'postal', 'apelido');
foreach($post_vars as $var) {
    $$var = "'" . mysql_real_escape_string($_POST[$var]). "', ";
}

$sql = "INSERT INTO clientes (iphone3g1, iphone3g2, nome, iphone41, postal, apelido, valor) VALUES ($var '$valor')";
$query= mysql_query($sql);




Alguém quer dar uma dica?


as variáveis estão a cair no sítio certo por referencia, no entanto como queres pegar no $var e que ele tenha todos os teus valores pretendidos quando não fazes nada para os ter ?

mais valia concatenares que estar a usar referencias só por usar
Offline

apaulo 
Membro
Mensagens 345 Gostos 2
Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 100 Posts 50 Posts

Código: [Seleccione]
$$var = "'" . mysql_real_escape_string($_POST[$var]). "', ";
Dois $ em frente a var...


Corrijo a minha referência, pois li mal o código.  :-#
Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Paulo, chama-se variamos variables.

Kayvadra, os valores estão a vir dum ficheiro com formulário...

Concatenação, nao vejo necessidade.

Offline

Jeckerson 
Membro
Mensagens 34 Gostos 0
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Level 5 Level 4 Nineth year Anniversary Eighth year Anniversary Super Combination Combination Topic Starter Poll Voter Level 3 Level 2

Código: (php) [Seleccione]
//super-duper function for insert
function insert_query($array, $table = "",$show_query = false)
{
if($show_query)
{
echo "INSERT INTO ".$table." (".join(",",array_keys($array)).") VALUES (".join(",",$array).")<br /><br />";
}

        if(!is_array($array) or sizeof($array) == 0)
{
//echo 'Array cannot be empty!';
return false;
}  
else
{
if(mysql_query("INSERT INTO ".$table." (".join(",",array_keys($array)).") VALUES (".join(",",$array).")"))
{
return true;
}              
else
{
return false;
                        //just in case.
                        //echo/return mysql_error();
}
}
unset($array);
}



O teu código alterado
Código: (php) [Seleccione]
$valor = $_POST['valor'];

$post_vars = array('iphone3g1', 'iphone3g2', 'nome', 'iphone41', 'postal', 'apelido','valor');
$arr = array();
foreach($post_vars as $var)
{
    $arr['`'.$var.'`'] => mysql_real_escape_string(trim($_POST[$var]));
}

$query = insert_query($arr,'clientes');
if($query == true)
{
    echo 'All cool, ty for add!';
}
else
{
   echo 'There was some problem for add this product.';
}

se quizeres ver o query formado, basta usar 3ª opção da função

Código: (php) [Seleccione]
//TRUE
insert_query($arr,'clientes',TRUE);


Também podes fazer array desse tipo

Código: (php) [Seleccione]

//example of array for 'insert_query' function
$arr = array(
'`id`'        => '"'.$_POST['id'].'"',
'`name`'  => '"'.$_POST['name'].'"',
'`text`'    => '"'.$_POST['text'].'"',
);

insert_query($arr,'some_table');

Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

jekerson,

gostei muito do teu trabalho, fico-te muito grato pelo esforço, mas sinceramente prefiro um código mais pequeno, mais fácil de manter.

Finalmente, depois de umas horas valentes a tentar perceber o que estava mal, cheguei ao resultado esperado:

Código: [Seleccione]
$valor = $_POST['valor'];

$post_vars = array('iphone3g1', 'iphone3g2', 'nome', 'iphone41', 'postal', 'apelido');
$post_values = array();
foreach($post_vars as $var) {
    $post_values[$var] = "'" . mysql_real_escape_string($_POST[$var]). "'";
}

$sql = "INSERT INTO clientes (" . implode(',', array_keys($post_values)) . ") VALUES (" . implode(',', array_values($post_values)) . ")";
$query= mysql_query($sql);

Não sei até que ponto é bom ter os values do formulário iguais aos nomes das tabelas, será que não torna o código mais vulnerável a SQL Injections? Uma vez que facilmente se sabe quais tabelas selecionar e fazer drop por exemplo, ía dar-me uma dor de cabeça...
Offline

Jeckerson 
Membro
Mensagens 34 Gostos 0
Feedback +1

Troféus totais: 22
Trófeus: (Ver todos)
Level 5 Level 4 Nineth year Anniversary Eighth year Anniversary Super Combination Combination Topic Starter Poll Voter Level 3 Level 2

jekerson,

gostei muito do teu trabalho, fico-te muito grato pelo esforço, mas sinceramente prefiro um código mais pequeno, mais fácil de manter.

ty


Código: (php) [Seleccione]
$valor = $_POST['valor'];

$post_vars = array('iphone3g1', 'iphone3g2', 'nome', 'iphone41', 'postal', 'apelido');
$post_values = array();
foreach($post_vars as $var) {
    $post_values[$var] = "'" . mysql_real_escape_string($_POST[$var]). "'";
}

$sql = "INSERT INTO clientes (" . implode(',', array_keys($post_values)) . ") VALUES (" . implode(',', array_values($post_values)) . ")";
$query= mysql_query($sql);

Não te custa nada de fazer um ficheiro só com funções, assim o código vai ser limpo e facil de perceber, se fazer algo disso:

Código: (php) [Seleccione]
include('functions.php');

if($_POST['submit'])
{
       //só que aqui nos VALUES do query eles tem estar com '' ou "" -> INSERT INTO table ('id','name','text') VALUES ('1','Hello','My name is');
       insert_query($_POST,'some_table');
}


Não sei até que ponto é bom ter os values do formulário iguais aos nomes das tabelas, será que não torna o código mais vulnerável a SQL Injections? Uma vez que facilmente se sabe quais tabelas selecionar e fazer drop por exemplo, ía dar-me uma dor de cabeça...

Nope, só tu é que sabes a estutura das tabelas, e para fazer drop, no minimo o hacker-dude precisa de ter accesso ao FTP e saber username/password da conta do MySQL. Mas se tens paranóia, então faz um script de autobackup com cron, que vai copiar BD e enviar para o teu email cada dia, por exemplo.
E não esqueças de:

Código: (php) [Seleccione]
mysql_real_escape_string();
trim();
htmlentities();
urlencode();
intval() / is_int() / preg_match('/^([0-9]{1,11})$/',$_GET['id']);
etc.
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

Paulo, chama-se variamos variables.

Kayvadra, os valores estão a vir dum ficheiro com formulário...

Concatenação, nao vejo necessidade.


Ainda bem que resolves-te.
Se tivesses lido o meu post com atenção terias resolvido mais cedo, ou a concatenação ou o implode como o usas-te.
Fico feliz por ti por não teres usado a minha sugestão e teres implementado o implode
Offline

Souza 
Elite
Mensagens 1816 Gostos 1
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1

Ainda bem que resolves-te.
Se tivesses lido o meu post com atenção terias resolvido mais cedo, ou a concatenação ou o implode como o usas-te.
Fico feliz por ti por não teres usado a minha sugestão e teres implementado o implode

Não percebi se estavas a ser irónico...
Offline

kaydara 
Membro
Mensagens 616 Gostos 1
Feedback +1

Troféus totais: 21
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 4 Level 3 Level 2 Level 1 500 Posts 100 Posts

nada ironias ali.

ainda bem que resolves-te