我编写了一个脚本,用于检查通过textarea接收的名称的批量输入,并省略数据库中已有的所有值。如果您只输入一个重复的名称,它就有效。如果输入两个或更多,它将过滤掉第一个重复的名称,将其余名称视为唯一名称并将其插入数据库中。我无法弄清楚原因。
首先,这是一个内置于脚本另一部分的数组。它是从数据库查询生成的:
Array
(
[0] => john
[1] => peter
[2] => max
[3] => jake
)
此数组称为$ onlyHandles。然后这是脚本:
if((isset($_POST['extract']) && !empty($_POST['extract']))){
$handles = trim($_POST['extract']);
$handles = explode("\n", $handles);
if(count($handles)>200){
echo 'error';
exit(1);
}
foreach($handles as $handle) {
$handleRep = strtolower(str_replace('@','',$handle));
$handleClean = str_replace(str_split('\\/:*?&"<>=+-#%$|'), ' ', $handleRep, $count);
if ($count > 0) {
echo 'error';
exit(1);
}
else{
if (in_array($handleClean, $onlyHandles)){
$delmessage .= "<p>".$handleClean." is already in your list.</p>";
}
else{
$sqlIns = "INSERT INTO...blah blah blah)";
$resultIns = mysql_query($sqlIns);
$resInsArr[] = array($resultIns);
}
}
}
$countresIns = count($resInsArr);
if ($countresIns > 0){
$delmessage .= "<p>User(s) added to list succesfully!</p>" ;
}
}
现在,如果你在textarea中输入“john”,它会喊出这个名字已经存在。如果输入“john”和“max”,它将省略john并添加最大值
非常感谢任何帮助。
P.S。关于查询格式,我知道,我知道,谢谢!
答案 0 :(得分:0)
我想告诉大家如何实现它:
替换第一行:
if((isset($ _ POST [&#39; extract&#39;])&amp;&amp;!empty($ _ POST [&#39; extract&#39;]))){
通过
if((!empty($_POST['extract']))){
因为!empty
已经向你保证isset
U也可以使用正则表达式的力量来替换不需要的字符 在替换:
第12行:$handleClean = str_replace(str_split('\\/:*?&"<>=+-#%$|'), ' ', $handleRep, $count);
通过:
$handleClean = preg_replace("/\[\/:\*?&\"<>=\+-#%\$\|\]*/", ' ', $handleRep, $count);
第2行:$handles = trim($_POST['extract']);
通过(修剪不是必要的)
$handles = $_POST['extract'];
和
第11行:$handleRep = strtolower(str_replace('@','',$handle));
通过
$handleRep = trim(strtolower(str_replace('@','',$handle)));
嘿; - ),
你还应该添加一些print_r(...)来调试每一步
答案 1 :(得分:0)
感谢@Ulrich Tevi Horus让我的代码更清洁,但没有解决神秘消失的用户。 @shulard,你应该发布这个作为获得upvote的答案。 array_diff确实是最好的解决方案。 这是最终的代码。需要一些整理,但它足以让我的服务器进行测试。
//this is the current contents of the list:
$onlyHandles = array();
foreach ($organizedArray as $key2 => $val2) {
$onlyHandles[] = $val2['name'];
}
echo "<br>begin onlyhandles<br>";
print_r($onlyHandles);
echo "<br>end onlyhandles<br>";
//finish preparation for display
//if names submitted for the list list
if(!empty($_POST['extract'])){
$handles = trim($_POST['extract']);
$handles = explode("\n", $handles); //this is now an array
echo "<br>begin handles<br>";
print_r($handles);
echo "<br>end handles<br>";
//$countInput = count($handles);
if($countInput>200){
echo '<p style="color:red;">Please Enter fewer than 200 names!</p>';
exit(1);
}
else{
$handleFinal = array();
foreach($handles as $handle) {
//$handleRep = strtolower(str_replace('@','',$handle));
$handleRep = trim(strtolower(str_replace('@','',$handle)));
$handleClean = str_replace(str_split('\\/:*?&"<>=+ -#%$|'), 'p', $handleRep, $count);
//$handleClean = preg_replace("/\[\/:\*?&\"<>=\+-#%\$\|\s+\]*/", ' ', $handleRep, $count);
echo "handleClean: ".$handleClean."<br>";
if ($count > 0) {
echo '<p style="color:red;">Your input contained special characters.</p>';
exit(1);
}
else{
$handleFinal[] = $handleClean;
}
}//end foreach
}//finish checking count input number
echo "<br>begin handleFinal<br>";
print_r($handleFinal);
echo "<br>end handleFinal<br>";
$countFinal = count($handleFinal);
echo "<br>countfinal is ".$countFinal."<br>";
//check if this user is already in the list
$handleDiffs = array_diff($handleFinal,$onlyHandles);
echo "<br>begin handlediffs<br>";
print_r($handleDiffs);
echo "<br>end handlediffs<br>";
foreach($handleDiffs as $handleDiff) {
$sqlIns = "blah blah blah";
$resultIns = mysql_query($sqlIns);
$resInsArr[] = array($resultIns);
}
$countresIns = count($resInsArr);
if ($countresIns > 0){
$delmessage .= "<p>User(s) added to the list succesfully!</p>" ;
}
}
答案 2 :(得分:0)
我发布我的comment answer作为真正的答案:)
您必须修剪$handle
变量,因为它周围可能有一些空格...
然后关于你的问题,我不明白。您的代码似乎&#34;干净&#34;,也许您应该考虑将strict
标记设置为true
,请参阅function definition here。