2016-05-11 31 views
0

我有一个名为HTML代码集的PHP文件,这段代码显示了为下一个进程选择的位置的多个ID(Form是GET)。PHP错误:数组到字符串转换

$sqloc = mysql_query("SELECT loc_id FROM location"); 
while ($row = mysql_fetch_array($sqloc)){ 

echo "<tr><td> 
    <label><input type=\"checkbox\" name=\"chk_loc[]\" value=". $row['loc_id'] ." /> 
</td><td>" . $row['loc_id'] . "</td></tr></label>"; } 

然后在其他PHP文件中,我使用此代码根据所选ID使用复选框之前选择数据。

$cbarray = array(); 
if (isset($_GET['submit_location'])) { 
    $cbarray = $_GET['chk_loc']; } 

for ($i=0; $i<count($cbarray); $i++) { 
    $sqlcb = mysql_query("SELECT * FROM location WHERE loc_id = '$cbarray'"); 
     while($ccb= mysql_fetch_row($sqlcb)) { 
       print_r($ccb); } 
} 

但是当我运行它,它出现在通知:

Array对字符串转换....在线62

在这是对($线62 sqlcb = mysql_query)部分。我已经使用var_dump来检查数组,并且它像这样打印数组:

array(4) { [0]=> string(5) "LO001" [1]=> string(5) "LO003" [2]=> string(5) "LO004" [3]=> string(5) "LO005" } 

有没有办法解决这个问题?谢谢。

+2

因此,$ cbarray是数组,你试图将它转换为字符串(在SQL查询中),你还能期待什么?还注意到sql注入问题 –

+0

简单的解决方法 - 你需要不使用'... WHERE loc_id ='$ cbarray'“);'''WHERE loc_id ='”。$ cbarray [$ i]。“'” );'..我想推荐使用'PDO/mysqli'而不是弃用'myqsl_''函数和'foreach'而不是'for'。 Ofc收到的参数需要进行消毒或使用“绑定”变量(使用PDO/mysqli)。 – Wizard

回答

3

php中的复选框是作为数组进行处理的。在代码中,id为chk_loc的复选框以数组形式存储在$ cbarray中。 $sqlcb = mysql_query("SELECT * FROM location WHERE loc_id = '$cbarray'");在此代码中,where子句接受一个字符串,并且您正在提供一个数组。

并使用PDO来防止SQL注入PDO PHP

+2

加上一个PDO消化。 MYSQL函数被弃用和不安全。 –

+1

@JacekKowalewski(y)(Y):=) –

+0

它*是*可能写作就像伪劣,不安全的查询,并通过'PDO :: query'发送它们 - 本身PDO不会阻止人们写错码。 – CD001

1

的问题是,因为这句话的,

$sqlcb = mysql_query("SELECT * FROM location WHERE loc_id = '$cbarray'"); 
                   ^see here 

$cbarray实际上是一个数组,而不是字符串。您可以使用var_dump($cbarray);来查看它的结构。

所以解决是:

使用implode()功能与字符串加入数组元素,并用它在你的查询,例如:

$cbarray = array(); 
if (isset($_GET['submit_location'])) { 
    $cbarray = $_GET['chk_loc']; 

    $query = "SELECT * FROM location WHERE loc_id IN ('" . implode("','", array_map('mysql_real_escape_string', $cbarray)) . "')"; 
    $sqlcb = mysql_query($query); 
    while($ccb= mysql_fetch_row($sqlcb)) { 
     print_r($ccb); 
    } 
} 

旁注:不要使用mysql_*函数,它们自PHP 5.5起弃用,并且在PHP 7.0中完全删除。改为使用mysqlipdoAnd this is why you shouldn't use mysql_* functions

+0

@tadman OP的查询容易受到SQL注入的影响,这就是为什么我还会放一个**旁注**,*以防万一*。 –

+0

我知道你指出了这一点,但你甚至没有尝试解决这个问题,这就是我所说的。就像“这里,你指着你的脚的枪被卡住了,但我把它固定了。” – tadman

+0

@tadman你的意思是说,使用'mysql_real_escape_string()'? –