Php PDO数组(如果记录已存在)
我使用数组从一个提交按钮插入多行。记录的插入工作进展顺利。现在,如果记录已经存在,我想停止插入数据。我的单记录更新语法是防止同一记录多次插入。但在使用数组时,我很困惑,也不知道该怎么做。我尝试了很多,但每种方法都显示错误 此代码正在运行 我的意图是,如果数据已经插入,就停止插入。所以我试着这样做。我确信这是错误的,因为数组变量无法传递到第一个语法**sql1**,并且$query未被访问到foreach子句。我不知道,所以我就这样用过。请给我提供任何停止已插入记录的方法 我想更改此代码Php PDO数组(如果记录已存在),php,mysql,arrays,pdo,insert,Php,Mysql,Arrays,Pdo,Insert,我使用数组从一个提交按钮插入多行。记录的插入工作进展顺利。现在,如果记录已经存在,我想停止插入数据。我的单记录更新语法是防止同一记录多次插入。但在使用数组时,我很困惑,也不知道该怎么做。我尝试了很多,但每种方法都显示错误 此代码正在运行 我的意图是,如果数据已经插入,就停止插入。所以我试着这样做。我确信这是错误的,因为数组变量无法传递到第一个语法**sql1**,并且$query未被访问到foreach子句。我不知道,所以我就这样用过。请给我提供任何停止已插入记录的方法 我想更改此代码 我想推荐
我想推荐以下方法。首先,您需要一个动态函数,它应该检查相关表中的记录
function isExist($columnName, $columnValue, $tableName){
$columnName = (!empty($columnName)) ? $columnName : 'empty';
$columnValue = (!empty($columnValue)) ? $columnValue : 'empty';
$tableName = (!empty($tableName)) ? $tableName : 'empty';
$exist = 0;
if($columnName != 'empty' && $columnValue != 'empty' && $tableName != 'empty'){
$sql = "select * from `".$tableName."` where `".$columnName."` = '".$columnValue."'";
$isExist = mysqli_query($this->connection,$sql);
if(mysqli_num_rows($isExist) > 0){
$exist = 1;
}
}
return $exist;
}
然后按照以下方式在函数中使用它
if(isset($_POST['submit'])){
$error = 0;
$response = array();
$number = $_POST['number'];
$letter = $_POST['letter'];
$number_name_exist = $this->isExist('number', $number, 'class');
if($number_name_exist == 1){
$error = 1;
$response['error'] = $number . ' is already exists';
}
if($error == 0){
$sql = "INSERT INTO class(number, letter) VALUES(:number, :letter)";
$query = $con->prepare($sql);
foreach($number AS $key => $n){
$query->bindParam(':number', $number[$key]);
$query->bindParam(':letter', $letter[$key]);
$query->execute();
}
}
}
在上面的示例中,您可以看到$error变量和$response数组,这将使您的脚本更加动态,您可以防止重复插入,还可以检查多个列。我推荐以下方法。首先,您需要一个动态函数,它应该检查相关表中的记录
function isExist($columnName, $columnValue, $tableName){
$columnName = (!empty($columnName)) ? $columnName : 'empty';
$columnValue = (!empty($columnValue)) ? $columnValue : 'empty';
$tableName = (!empty($tableName)) ? $tableName : 'empty';
$exist = 0;
if($columnName != 'empty' && $columnValue != 'empty' && $tableName != 'empty'){
$sql = "select * from `".$tableName."` where `".$columnName."` = '".$columnValue."'";
$isExist = mysqli_query($this->connection,$sql);
if(mysqli_num_rows($isExist) > 0){
$exist = 1;
}
}
return $exist;
}
然后按照以下方式在函数中使用它
if(isset($_POST['submit'])){
$error = 0;
$response = array();
$number = $_POST['number'];
$letter = $_POST['letter'];
$number_name_exist = $this->isExist('number', $number, 'class');
if($number_name_exist == 1){
$error = 1;
$response['error'] = $number . ' is already exists';
}
if($error == 0){
$sql = "INSERT INTO class(number, letter) VALUES(:number, :letter)";
$query = $con->prepare($sql);
foreach($number AS $key => $n){
$query->bindParam(':number', $number[$key]);
$query->bindParam(':letter', $letter[$key]);
$query->execute();
}
}
}
在上面的示例中,您可以看到$error变量和$response数组,这将使脚本更加动态,您可以防止重复插入,还可以检查多个列。这应该可以:
使现代化
@AlivetoDie建议的解决方案可以作为插入唯一数据并删除重复数据的简写方式。但是,它没有任何方法来跟踪失败的数据索引,因为查询总是返回TRUE 这应该有效:
使现代化
@AlivetoDie建议的解决方案可以作为插入唯一数据并删除重复数据的简写方式。但是,它没有任何方法来跟踪失败的数据索引,因为查询总是返回TRUE 在$stmt->bindParam行中:number',$number[$key]$密钥未定义。我正在处理您的问题,您是否仍然需要解决方案?在$stmt->bindParam:number',$number[$key]行中$密钥未定义。我正在处理您的问题,您还需要解决方案吗?非常感谢。我一整天都在尝试不同的方法。终于成功了,不用客气,非常感谢。我一整天都在尝试不同的方法。终于成功了。别提了:
if(isset($_POST['submit'])){
$error = 0;
$response = array();
$number = $_POST['number'];
$letter = $_POST['letter'];
$number_name_exist = $this->isExist('number', $number, 'class');
if($number_name_exist == 1){
$error = 1;
$response['error'] = $number . ' is already exists';
}
if($error == 0){
$sql = "INSERT INTO class(number, letter) VALUES(:number, :letter)";
$query = $con->prepare($sql);
foreach($number AS $key => $n){
$query->bindParam(':number', $number[$key]);
$query->bindParam(':letter', $letter[$key]);
$query->execute();
}
}
}
if (isset($_POST['submit'])) {
if(!empty($_POST['number']) && !empty($_POST['letter']) )
{
$number = $_POST['number'];
$letter = $_POST['letter'];
// Assuming both $number and $letter 1 dimensional array with equal number of indexes
$notInsertedKey = [];
foreach ($number AS $key => $item) {
/* Checking Existence*/
$sql1 = 'SELECT COUNT(*) as counted FROM class WHERE number = :number';
$stmt = $con->prepare($sql1);
$stmt->bindParam(':number', $number[$key]);
$stmt->execute();
$data = $stmt->fetch(PDO::FETCH_ASSOC);
if ($data['counted'] < 1) {
// echo "Not Exist";
$sql = "INSERT INTO class(number, letter) VALUES (:number, :letter)";
$query = $con->prepare($sql);
$query->bindParam(':number', $number[$key]);
$query->bindParam(':letter', $letter[$key]);
$query->execute();
} else {
$notInsertedKey[] = $key;
// Incase you want to know the failed indexes.
echo "<script>alert('Class is already existed')</script>";
}
}
}
}