簡體   English   中英

PHP/MySQL:插入逗號以分隔從 html 表單中提取到 MySQL 查詢的變量

[英]PHP/MySQL: Inserting commas to separate variables pulled from html form in to MySQL query

我目前正在編寫一個腳本來隨機化不同的輸入值。 這是 php 腳本的主要部分:

$alive='';
if(isset($_GET['alive'])) {
$alive=$_GET['alive'];
}
$injured='';
if(isset($_GET['injured'])) {
$injured=$_GET['injured'];
}
$deceased='';
if(isset($_GET['deceased'])) {
$deceased=$_GET['deceased'];
}
$unkstat='';
if(isset($_GET['unkstat'])) {
$unkstat=$_GET['unkstat'];
}
$found='';
if(isset($_GET['found'])) {
$found=$_GET['found'];
}
$missing='';
if(isset($_GET['missing'])) {
$missing=$_GET['missing'];
}
$youth='';
if(isset($_GET['youth'])) {
$youth=$_GET['youth'];
}
$adult='';
if(isset($_GET['adult'])) {
$adult=$_GET['adult'];
}
$unkage='';
if(isset($_GET['unkage'])) {
$unkage=$_GET['unkage'];
}
$incidentid='';
if(isset($_GET['incidentid'])) {
$incidentid=$_GET['incidentid'];
}
$limit='';
if(isset($_GET['limit'])) {
$limit=$_GET['limit'];
}

mysql_connect ("$host", "$username", "$password") or die ("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$sql="INSERT INTO $tbl_name (given_name, family_name, gender, status, age, incidentid)
select First10.$gender, Last10.family_name,
(SELECT $gender from gender) AS Gender,
(SELECT * FROM status WHERE status IN ($alive $injured $deceased $unkstat $found $missing)) AS Status,
(SELECT * FROM age WHERE age IN ($youth $adult $unkage)) AS Age,
(SELECT $incidentid from incidentid) AS Incident_ID
from ( select fn.$gender, @fns := @fns + 1 as Sequence
from ( select $gender from fnames where $gender IS NOT NULL order by rand() limit 100) fn,
(select @fns := 0 ) vars ) First10
JOIN
( select ln.family_name, @lns := @lns + 1 as Sequence
from ( select family_name from lastnames order by rand() limit 100 ) ln,
(select @lns := 0 ) vars ) Last10
ON First10.Sequence = Last10.Sequence";

html 在這里:

<p>
Status: <BR>
<INPUT TYPE=CHECKBOX name="alive" value="'alive'">Alive and Well<BR>
<INPUT TYPE=CHECKBOX name="injured" value="'injured'">Injured<BR>
<INPUT TYPE=CHECKBOX name="deceased" value="'deceased'">Deceased<BR>
<INPUT TYPE=CHECKBOX name="unkstat" value="'unknown'">Unknown<BR>
<INPUT TYPE=CHECKBOX name="found" value="'found'">Found<BR>
<INPUT TYPE=CHECKBOX name="missing" value="'missing'">Missing<BR>
</p>

<p>
Age: <BR>
<INPUT TYPE=CHECKBOX name="youth" value="'youth'">Youth (0-17)<BR>
<INPUT TYPE=CHECKBOX name="adult" value="'adult'">Adult (18+)<BR>
<INPUT TYPE=CHECKBOX name="unkage" value="'unknown'">Unknown<BR>
</p

我想做的是從復選框中提取值並將選中的值插入到 mysql 查詢中。 然后,查詢將在預制表中搜索這些值並將它們插入到單獨的表中。 我的問題是,每當我引入變量時,我都會收到一個語法錯誤,通常會導致如下結果:

'SELECT * FROM status WHERE status IN ('alive' 'injured' 'deated' ) AS Status'

括號內的值似乎需要逗號來分隔它們,但我想不出,也找不到有效地做到這一點的方法。 請指教。 你們太棒了:)

創建一個數組。 使用array_push將每個設置值推送到數組。 然后使用implode(",",$array)創建逗號分隔值變量。 在你的 IN 語句中使用它

結合 PeeHaa 的回應的例子。

$vars = array('alive', 'injured', 'deceased', 'unkstat', 'found', 'etc', ); 
$result = array(); 
foreach($vars as $var) { 
   if (isset($_GET[$var])) {
     array_push($_GET[$var], $result);
   }
}
$result = implode(",",$result);

我可以建議一個更好的解決方案。 您可以創建 forms,通過在名稱末尾添加方括號(例如status[] )將array返回到 PHP。 使用數組將使您的 PHP 代碼簡短,因為您不需要單獨查找每個變量。 例如:

HTML:

<p>
Status: <BR>
<INPUT TYPE=CHECKBOX name="status[]" value="alive">Alive and Well<BR>
<INPUT TYPE=CHECKBOX name="status[]" value="injured">Injured<BR>
<INPUT TYPE=CHECKBOX name="status[]" value="deceased">Deceased<BR>
<INPUT TYPE=CHECKBOX name="status[]" value="unknown">Unknown<BR>
<INPUT TYPE=CHECKBOX name="status[]" value="found">Found<BR>
<INPUT TYPE=CHECKBOX name="status[]" value="missing">Missing<BR>
</p>

PHP:

$sql = 'SELECT * FROM status WHERE status IN ("' . implode('","', array_map('mysql_real_escape_string', $_REQUEST['status'])) . '")';

implode function 會將數據連接在一起。 我還添加了一個array_map調用,它將通過mysql_real_escape_string運行每個數組值以轉義該值,以防萬一。

$in_clause = '';
$in_clause_t = '';

$alive='';
if(isset($_GET['alive'])) {
    $alive=$_GET['alive'];
    $in_clause .= $alive . ", ";
}
$injured='';
if(isset($_GET['injured'])) {
    $injured=$_GET['injured'];
    $in_clause .= $injured . ", ";
}
$deceased='';
if(isset($_GET['deceased'])) {
    $deceased=$_GET['deceased'];
    $in_clause .= $deceased . ", ";
}
$unkstat='';
if(isset($_GET['unkstat'])) {
    $unkstat=$_GET['unkstat'];
    $in_clause .= $unkstat . ", ";
}
$found='';
if(isset($_GET['found'])) {
    $found=$_GET['found'];
    $in_clause .= $found . ", ";
}
$missing='';
if(isset($_GET['missing'])) {
    $missing=$_GET['missing'];
    $in_clause .= $missing . ", ";
}
$youth='';
if(isset($_GET['youth'])) {
    $youth=$_GET['youth'];
    $in_clause_t .= $youth . ", ";
}
$adult='';
if(isset($_GET['adult'])) {
    $adult=$_GET['adult'];
    $in_clause_t .= $adult . ", ";
}
$unkage='';
if(isset($_GET['unkage'])) {
    $unkage=$_GET['unkage'];
    $in_clause_t .= $unkage . ", ";
}
$incidentid='';
if(isset($_GET['incidentid'])) {
    $incidentid=$_GET['incidentid'];
}
$limit='';
if(isset($_GET['limit'])) {
    $limit=$_GET['limit'];
}

if (strlen($in_clause) > 0) {
    $in_clause = substr($in_clause, 0, (strlen($in_clause) - 2));
}

if (strlen($in_clause_t) > 0) {
    $in_clause_t = substr($in_clause_t, 0, (strlen($in_clause_t) - 2));
}

mysql_connect ("$host", "$username", "$password") or die ("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

$sql="INSERT INTO $tbl_name (given_name, family_name, gender, status, age, incidentid)
select First10.$gender, Last10.family_name,
(SELECT $gender from gender) AS Gender,
(SELECT * FROM status WHERE status IN (" . $in_clause . ") AS Status,
(SELECT * FROM age WHERE age IN (" . $in_clause_t . ")) AS Age,
(SELECT $incidentid from incidentid) AS Incident_ID
from ( select fn.$gender, @fns := @fns + 1 as Sequence
from ( select $gender from fnames where $gender IS NOT NULL order by rand() limit 100) fn,
(select @fns := 0 ) vars ) First10
JOIN
( select ln.family_name, @lns := @lns + 1 as Sequence
from ( select family_name from lastnames order by rand() limit 100 ) ln,
(select @lns := 0 ) vars ) Last10
ON First10.Sequence = Last10.Sequence";

這應該這樣做。

使用您當前的設置,在問題陳述的每個變量后添加逗號:

SELECT * FROM status WHERE status IN ($alive, $injured, $deceased, $unkstat, $found, $missing)) AS Status

有點拙劣,但這可以工作....

基本上形成所有 $_POST 變量的逗號分隔列表...

<form action="" method="post">

<p>
Status: <BR>
<INPUT TYPE=CHECKBOX name="alive" value="'alive'">Alive and Well<BR>
<INPUT TYPE=CHECKBOX name="injured" value="'injured'">Injured<BR>
<INPUT TYPE=CHECKBOX name="deceased" value="'deceased'">Deceased<BR>
<INPUT TYPE=CHECKBOX name="unkstat" value="'unknown'">Unknown<BR>
<INPUT TYPE=CHECKBOX name="found" value="'found'">Found<BR>
<INPUT TYPE=CHECKBOX name="missing" value="'missing'">Missing<BR>
</p>

<p>
Age: <BR>
<INPUT TYPE=CHECKBOX name="youth" value="'youth'">Youth (0-17)<BR>
<INPUT TYPE=CHECKBOX name="adult" value="'adult'">Adult (18+)<BR>
<INPUT TYPE=CHECKBOX name="unkage" value="'unknown'">Unknown<BR>
</p>

<input type="submit">


<?php 

if(isset($_POST)) {
    print_r($_POST);
    $str = implode(",",$_POST);
    echo $str;
}

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM